C#/ WPF使用async和await但UI线程仍然被阻止

时间:2012-06-07 15:06:56

标签: c# user-interface asynchronous async-await

我有这个简单的代码:

private async void Button_Click_2(object sender, RoutedEventArgs e)
{
    var progress = new Progress<int>();

    progress.ProgressChanged += (a, b) =>
    {
        this.progressBar.Value = b;
    };

    // this is blocking
    await this.LongRunOpAsync(filepath, progress);

    // this is not blocking
    // await this.LongRunOpAsync(filepath, null);
}

public Task LongRunOpAsync(string filename, IProgress<int> progress)
{
    return Task.Run(() =>
    {
        using (var ops = new LongOps())
        {
            ops.LongRunOp(filename, progress);
        }
    });
}

点击我的按钮后,UI仍然无法进行长时间运行。如果我不使用Progress,而是将长时间运行的操作 null 作为UI未阻止的第二个参数。我很确定这个“错误”是由于我对异步/等待和线程的一些误解。

1 个答案:

答案 0 :(得分:1)

您展示的代码不会阻止UI线程。
实际上,如图所示,它不需要async / await - 所以我假设这不是实际的代码。

您需要查看ops.LongRunOpprogress函数的作用。

我怀疑它将progress编组回UI线程 - 因此它可以访问UI控件。
如果它经常太快地执行此操作,则会破坏UI线程并使应用程序无响应。