タスクAPIは、私がそれを使ってできるすべてのことが、DOよりもDO N'Tの方が多いことを考えると、一種の失敗の落とし穴のように感じます。しかし、私はそれをもっと使おうとしています、そして私はの問題全体について混乱していますasync void
。
私の問題は、アプリケーションがローカルデータファイルを永久に使用していて、高速な同期呼び出しが使用されていたために発生します。現在、いくつかのリモートソースはオプションであり、十分な遅延があります。すべてを非同期に切り替えています。
だから私はおそらくこのように見える方法を持っています:
void InitializeData() {
SomeProperty = _dataSource.Load(...);
}
低摩擦のために私がやりたい素朴なことは次のとおりです。
Task InitializeDataAsync() {
return Task.Run(() => {
SomeProperty = _dataSource.Load(...);
});
}
しかしasync void
、それを使用することがどれほどひどいのかについての記事は非常に多く、タスクを返すことについての議論ではぼやけているようです。だから、本当にそれを次のように書くための私の最良の選択肢です:
Task<DataType> FetchDataAsync() {
return _dataSource.LoadAsync(...);
}
...次に、すべての発信者を追跡し、準拠させますか?
のasync void
動作が異なりasync Task
、UnobservedTaskExceptionを使用すると恐ろしいため、人々の主張は悪いと思いますawait
。この状況では、を使用する可能性はほとんどありませんawait
。または、awaitを使用する場合は、UnobservedTaskExceptionについてすでに偏執的であるため、常にtry / catchが発生します。
そう:
async void
」と同じTask
ですか?await
、それはそれを軽減しますか?await
、常にtry / catchでラップすると問題が軽減されますか?async void
を返すことと同じではありませんTask
。の問題async void
は、タスクの例外(グローバル例外ハンドラー以外)を監視する方法がなく、タスクが完了するのを待つ方法がないことです(実際にはメソッドがないためawait
、async void
メソッドを実行できませんawait
)。これが理由です。避けるべきです。
戻るTask
あなたの場合、これらの問題を持っていないawait
、それが完了し、あなたが戻って待つ例外が取得されますときにあなたが知っているTask
完全に許容です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加