请有人建议为什么以下不起作用?我想要做的就是显示一个不确定的进度条,它在单击按钮时启动,然后在我完成一些工作后,我将不确定的进度条设置为 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/