10

await がタスク (awaitable) が完了するのを待つことを理解しています。しかし、私はそれが実際に何を意味するのかについて混乱しています。

動作しないコード:

public async override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    if (actionExecutedContext.Response.Content != null)
    {
        var responseContent = await actionExecutedContext.Response.Content.ReadAsStringAsync();
        DoSomething(responseContent);
    }
}

動作するコード:

public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
    if (actionExecutedContext.Response.Content != null)
    {
        var responseContent = actionExecutedContext.Response.Content.ReadAsStringAsync().ContinueWith(
        task =>
        {
            DoSomething(task.Result);
        });
    }
}

明らかに、非同期操作がまだ保留中のときに、非同期モジュールまたはハンドラーが完了したというエラーメッセージが表示されます。非同期呼び出しが完了するのを待たずに、代わりに「メイン」スレッドが続行されたことを示しています。スレッドが継続することを期待していましたが、現在のメソッド内ではありませんでした。スレッドがasp.netスタックに戻り、他の作業を行い、await asyncOperation()操作が完了すると戻ると思いました。

私は他の場所でも await を使用しています-(たとえば、Web サービスの応答を待っています)-どこでも同様の問題に遭遇しませんでした。なぜ IActionFilterAttribute の動作が異なるのだろうか。実際、私の Web サービス呼び出しは、おそらく応答の内容を文字列に読み取るよりも時間がかかります。

誰かが私を啓発してもらえますか?コンセプトが理解できなかった気がします。

4

2 に答える 2