我有这个简单的代码:
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未阻止的第二个参数。我很确定这个“错误”是由于我对异步/等待和线程的一些误解。
答案 0 :(得分:1)
您展示的代码不会阻止UI线程。
实际上,如图所示,它不需要async / await - 所以我假设这不是实际的代码。
您需要查看ops.LongRunOp
对progress
函数的作用。
我怀疑它将progress
编组回UI线程 - 因此它可以访问UI控件。
如果它经常太快地执行此操作,则会破坏UI线程并使应用程序无响应。