C# WPF 不确定进度条

标签 c# wpf

请有人建议为什么以下不起作用?我想要做的就是显示一个不确定的进度条,它在单击按钮时启动,然后在我完成一些工作后,我将不确定的进度条设置为 false 以停止它。

但是,当我运行下面的代码时,不确定的进度条甚至没有启动。我尝试注释掉 this.progressBar.IsIndeterminate = false 行,当我这样做时,进度条开始但不会终止。

private void GenerateCSV_Click(object sender, RoutedEventArgs e)
{
    this.Dispatcher.Invoke(DispatcherPriority.Normal, new Action(delegate ()
    {
        this.progressBar.IsIndeterminate = true;

        // do some work
        Thread.Sleep(10 * 1000);

        this.progressBar.IsIndeterminate = false;
    }));
}

最佳答案

您的代码无法工作,因为“做一些工作”发生在 UI 工作的同一个 Thread 上。那么,如果 Thread 忙于“工作”,它如何同时处理 ProgressBar 的 UI 动画呢? 您必须将“工作”放在另一个 Thread 上,因此 UI Thread 是免费的,并且可以使用 ProgressBar(或其他UI 控件)。

1) 创建一个完成工作并返回一个 Task 的方法,因此它可以“等待”完成:

private async Task DoWorkAsync()
{
    await Task.Run(() =>
    {
        //do some work HERE
        Thread.Sleep(2000);
    });
}

2) 将 async 修饰符放在 GenerateCSV_Click 上:

private async void GenerateCSV_Click(object sender, RoutedEventArgs e)

3) 扔掉所有“Dispatcher”/“Invoke”等东西,并以这种方式使用 DoWorkAsync:

private async void Button_Click(object sender, RoutedEventArgs e)
{
    PB.IsIndeterminate = true;

    await DoWorkAsync();

    PB.IsIndeterminate = false;
}

那么,现在发生了什么?当 GenerateCSV_Click 遇到第一个 await... 它开始自动在另一个 Thread 上工作,离开 UI Thread可以自由操作 ProgressBar 并为其设置动画。 工作完成后,该方法的控制返回到将 IsIndeterminate 设置为 false 的 UI Thread

在这里您可以找到关于async 编程的 MSDN 教程: https://msdn.microsoft.com/en-us/library/mt674882.aspx 如果你谷歌“C# async await”,你会发现很多教程、例子和解释;)

关于C# WPF 不确定进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39196709/

相关文章:

c# - Url.Action() 导致 System.AccessViolationException

c# - 当我实现一个基类也实现的接口(interface)时,为什么我没有收到编译器警告?

c# - 设置 'Auto'时获取WPF控件高度

c# - ApplicationBarIconButton 在 WP7 中不起作用

wpf - 属性触发器绑定(bind)到标志枚举

c# - 如何以编程方式推送 ToggleButton?

c# - 引用列按顺序排列

c# - 在 DockPanel 中填充 StackPanel

WPF DropShadowEffect 导致模糊

c# - 在 DataTable 上使用 LINQ 的 .Any()