我有这个简单的代码:
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 和线程的一些误解。