私は非同期メソッドを持っています:
public async Task DoSomethingAsync(){
...
await ...
await ...
....
return await SaveAsync();
}
ほとんどの場合、私はこのメソッドを次のように呼び出します。
await DoSomethingAsync()
この呼び出しは期待どおりに機能します。しかし、どこかで、このメソッドをfireと呼び、忘れる必要があります。
public void OtherMethod()
{
...
DoSomethingAsync(); //fire and forget here
}
この場合、タスクDoSomethingAsync()
が実行されて完了することもありますが、タスクが呼び出されないこともあります(または、await
内のいくつかを呼び出してもDoSomethingAsync()
最後のタスクを完了しないこともありますawait SaveAsync();
)。
私は、タスクがファイアで呼び出され、次のコードによって方法を忘れることを確認しようとしています。
public void OtherMethod()
{
...
Task.Factory.StartNew(() =>
{
await DoSomethingAsync();
}); //fire and forget again here
}
ただし、これは期待どおりには機能しません。だから私の質問は:
DoSomethingAsync()
せずに電話をかける方法await
は常に実行され、完了しますか?(AppDomainの再起動/クラッシュの場合は気にしません)
私はすべて削除した場合async/await
の内部コードをDoSomethingAsync()
と置き換えるawait
ことで.ContinueWith()
、その後の呼び出しTask DoSomethingAsync()
(持っていないasync
はい、どのくらいの呼び出しから(私がいない場合、メソッド宣言では)、(ケースのAppDomain再起動/クラッシュを無視する)呼び出され、完了してくださいされますタスクが10分後に呼び出されると私は幸せになると思います)?
待機は正常に機能しているはずなので、待機中の1つ以上のメソッドを保留している他の何かがここで発生している可能性があります。いくつかの可能性があります:
VSデバッガーを使用して接続し、何が起こっているかを観察できる場合は、一時停止して、並列スタックビューを確認してみてください。これは、検討する可能性を絞り込むのに役立つはずです。
スティーブンが指摘したように、ファイアアンドフォーゲットと呼んでいるときに例外が発生している可能性もあります。まだ行っていない場合は、TaskScheduler.UnobservedTaskExceptionを処理して、このようなイベントをログに記録してください。これはファイナライザーから呼び出されるため、呼び出される時間は非決定的であることに注意してください。イベントは、例外を引き起こした実際のイベントよりもはるかに遅くなるまで発生しない可能性があるため、これによりデバッグが難しくなる可能性があります。そのため、スティーブンのアドバイスに従い、タスクを保存して待機するか、後で別の場所で待機することをお勧めします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加