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动画? 您必须将“work”放在另一个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
设置动画。 完成工作后,方法的控制权返回到UI Thread
,该UI Thread
将IsIndeterminate
设置为false。
在这里你可以找到关于async
编程的MSDN教程: https : //msdn.microsoft.com/en-us/library/mt674882.aspx如果你谷歌“C#async等待”,你会发现很多教程,例子和解释;)