3

ベスト プラクティスは、非同期イベント ハンドラー以外のメソッドを避けること であり、他のユース ケースに対して非常に強い専門家の意見があることは承知しています。ただし、メソッドの有用性についての簡単な議論に参加しただけで、いくつか質問があります。async voidasync void

  • async voidフレームワークは、イベント ハンドラーを含む保留中のメソッドをどのように追跡しますか? それらの現在のリストを取得するか、それらをキャンセルする方法はありますか(編集済み:カスタムをインストールすることでおそらく追跡が可能SynchronizationContextです)?
  • それらは、ファイア アンド フォーゲット ロギングのシナリオに役立ちますか? メソッドの開始時に正しいタイムスタンプが保持されていて、同期的に実行されている限り、実際にはそうかもしれません。
4

3 に答える 3

3

フレームワークは、保留中の async void メソッド (イベント ハンドラーを含む) をどのように追跡しますか?

フレームワークは、async void メソッドを追跡するために特別なことは何もしません。それらは他の非同期メソッドと同じです。

また、メソッドには適切な署名があるか、ないかのどちらかです。イベント ハンドラーは気にせず、特に async を検出または処理するロジックがありません。

カスタム スケジューラは、実行中のタスクを追跡できますが、async void メソッドからのものかどうかについて特定の知識はありません。とにかく、これが正しい解決策だとは思いません。async void メソッドを追跡する必要がある場合は、設計を再考する必要があります。

それらは、ファイア アンド フォーゲット ロギング シナリオに役立ちますか? 正しいタイムスタンプが保持されている限り、実際にはそうかもしれません

タイムスタンプの意味がわからない?

Async void は、呼び出し元がメソッド呼び出しの結果を気にする必要がないメソッド、または別の場所で結果が通知されるメソッドには問題ありません。これらのケースは非常にまれです。

ファイア アンド フォーゲットはそのようなシナリオの 1 つかもしれませんが、人々はしばしばファイア アンド フォーゲットを誤用し、重要なバグを自分自身から隠してしまうだけだと思います。

于 2013-11-03T21:27:20.767 に答える