ASP.NETチームのDamianEdwardsは、次のように回答しました。
Webフォームの非同期voidイベントハンドラーは、ご存知のとおり、特定のイベントでのみサポートされていますが、実際には単純なタスクのみを対象としています。実際に複雑な非同期作業には、PageAsyncTaskを使用することをお勧めします。
ASP.NETチームのLeviBroderickは、次のように回答しました。
Webアプリケーションの非同期イベントは、本質的に奇妙な獣です。Async voidは、ファイアアンドフォーゲットプログラミングモデルを対象としています。これは、OSがアプリケーションを強制終了するまでアプリケーションが存続するため、Windows UIアプリケーションで機能します。したがって、非同期コールバックが実行されるたびに、対話できるUIスレッドが存在することが保証されます。Webアプリケーションでは、要求は定義上一時的なものであるため、このモデルは崩壊します。リクエストの終了後に非同期コールバックが実行された場合、コールバックが対話する必要のあるデータ構造がまだ良好な状態であるという保証はありません。したがって、なぜファイアアンドフォーゲット(および非同期ボイド)がWebアプリケーションでは本質的に悪い考えであるのか。
とは言うものの、私たちはPage_Loadのような非常に単純なものを機能させるためにクレイジーな体操を行っていますが、これをサポートするコードは非常に複雑であり、基本的なシナリオ以外のことについては十分にテストされていません。したがって、信頼性が必要な場合は、RegisterAsyncTaskを使用します。
ですから、私の質問に対する答えは、「それは間違った質問だ」ということだと思います。
正しい質問は、「ASP.NET Webフォームアプリケーションでどのように非同期にする必要がありますか?」です。そして答えは、このスニペットをaspx分離コードファイル内に挿入することです。
this.RegisterAsyncTask(new PageAsyncTask(async cancellationToken => {
var result = await SomeOperationAsync(cancellationToken);
// do something with result.
}));
これと同じトリックがASP.NETカスタムコントロール内で機能しますthis.Page.RegisterAsyncTask
。代わりに使用してください。