C#WPF不确定进度条

时间:2016-08-28 23:27:32

标签: 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;
    }));
}

1 个答案:

答案 0 :(得分:7)

您的代码无法正常工作,因为“做一些工作”发生在用户界面工作的同一个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设置动画。 工作完成后,方法的控制权将返回到UI Thread,将IsIndeterminate设置为false。

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