【发布时间】:2012-06-11 16:01:15
【问题描述】:
我有这个简单的代码:
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 和线程的一些误解。
【问题讨论】:
-
我认为你需要在 LongRunOpAsync 方法中使用 async 和 await ,而不是在按钮点击中。
标签: c# user-interface asynchronous async-await