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 サービス呼び出しは、おそらく応答の内容を文字列に読み取るよりも時間がかかります。
誰かが私を啓発してもらえますか?コンセプトが理解できなかった気がします。