c# WPF不确定进度条

本文关键字:不确定 WPF | 更新日期: 2023-09-27 18:04:38

请有人建议为什么以下不工作?我所要做的就是显示一个不确定的进度条,它在按钮被点击时开始,然后在我完成一些工作后,我将不确定的进度条设置为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;
    }));
}

c# WPF不确定进度条

你的代码不能工作,因为"做一些工作"发生在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。当工作完成后,该方法的控制权返回给UI Thread,并将IsIndeterminate设置为false。

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