8

async/await キーワードがどのように機能するかを理解しようとしています。TextBlockContent 文字列プロパティにバインドされた WPF ウィンドウ上のテキストブロックと、ChangeText() をクリックするとトリガーされるボタンがあります。

これが私のコードです:

public async void ChangeText()
{
     string mystring = await TestAsync();
     this.TextBlockContent= mystring;
}

private async Task<string> TestAsync()
{
     var mystring = await GetSomeString().ConfigureAwait(false);
     mystring = mystring + "defg";
     return mystring;
}

private Task<string> GetSomeString()
{
    return Task.Run(() =>
    {
        return "abc";
    });
}

私の読書から、ConfigureAwait を false に設定すると、await キーワードの後に​​実行する必要がある Task の「残り」の現在のコンテキストを保存したくないことを指定できることがわかりました。

デバッグ後、このコードがあると、次の行の後のメインスレッドでコードが実行されていることがあることに気付きました。私は具体的にconfigure awaitを追加しました。

タスクに入る前にあったスレッドとは異なるスレッドで常に実行されると予想していました。

誰かが理由を理解するのを手伝ってくれますか?

どうもありがとうございました

4

1 に答える 1

13

実行中のタスクがすぐに完了している可能性があります。つまりawait、継続をスケジュールする必要さえありません。メソッドは、必要なasync場合にのみ継続をスケジュールします。すでに完了したものを待っている場合は、同じスレッドで続行されます。

ConfigureAwait同じコンテキストで続行する必要がないというヒントです。同じコンテキストを続けてはならないという要件ではありません。

タスクをすぐに完了しないものに変更した場合、たとえば呼び出しThread.Sleep(1000)(もちろん、通常はそうしないでしょう) に変更すると、動作に変化が見られると思います。

他の何かを見逃した可能性があり、これが問題の原因ではない可能性がありますが、少なくとも最初にそれを試す価値があります.

于 2013-10-19T20:00:08.617 に答える