2

我有这个简单的代码:

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 不会阻塞。我很确定这个“错误”是由于我对 async/await 和线程的一些误解。

4

1 回答 1

1

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

您需要查看ops.LongRunOp该功能的progress作用。

我怀疑它会编组progress回 UI 线程——因此它可以访问 UI 控件。
如果它过于频繁和过快地执行此操作,它将淹没 UI 线程并使应用程序无响应。

于 2012-06-07T16:11:17.930 回答