私はこの簡単なコードを持っています:
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 を使用せず、代わりに実行時間の長い操作を 2 番目のパラメーターとしてnullにすると、UI はブロックされません。この「エラー」は、async/await とスレッドに関する誤解が原因であると確信しています。