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

4

1 に答える 1

1

あなたが示したコードは、UI スレッドをブロックしません。
実際、示されているように、async/await は必要ありません。したがって、これは実際のコードではないと想定しています。

関数で何をするかを調べる必要がありops.LongRunOpますprogress

progressUIスレッドにマーシャリングして戻ってくるのでは ないかと思います-UIコントロールにアクセスできます。
これがあまりにも頻繁に、あまりにも迅速に行われると、UI スレッドが圧倒され、アプリが応答しなくなります。

于 2012-06-07T16:11:17.930 に答える