起動して非同期タスクメソッドを忘れると、呼び出されないことがあります

langtu

私は非同期メソッドを持っています:

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
}

ただし、これは期待どおりには機能しません。だから私の質問は:

  1. DoSomethingAsync()せずに電話をかける方法awaitは常に実行され、完了しますか?(AppDomainの再起動/クラッシュの場合は気にしません)

  2. 私はすべて削除した場合async/awaitの内部コードをDoSomethingAsync()と置き換えるawaitことで.ContinueWith()、その後の呼び出しTask DoSomethingAsync()(持っていないasyncはい、どのくらいの呼び出しから(私がいない場合、メソッド宣言では)、(ケースのAppDomain再起動/クラッシュを無視する)呼び出され、完了してくださいされますタスクが10分後に呼び出されると私は幸せになると思います)?

そしてブライアント

待機は正常に機能しているはずなので、待機中の1つ以上のメソッドを保留している他の何かがここで発生している可能性があります。いくつかの可能性があります:

  1. いずれかのメソッドのどこかにデッドロックがあり、それが完了できず、待機の再開がブロックされています。
  2. すべてのスレッドプールスレッドが何らかの理由でブロックされており、保留中のタスクの実行が妨げられています。
  3. 同期コンテキストでasyncメソッドを実行していて、何かがコンテキストを保持しているため、ディスパッチされたコールバックを実行できません。通常、コンテキストはUIスレッドであり、アプリケーションUIをロックするため、通常、これは非常に明白です。

VSデバッガーを使用して接続し、何が起こっているかを観察できる場合は、一時停止して、並列スタックビューを確認してみてください。これは、検討する可能性を絞り込むのに役立つはずです。


スティーブンが指摘したように、ファイアアンドフォーゲットと呼んでいるときに例外が発生している可能性もあります。まだ行っていない場合は、TaskScheduler.UnobservedTaskException処理して、このようなイベントをログに記録してくださいこれはファイナライザーから呼び出されるため、呼び出される時間は非決定的であることに注意してください。イベントは、例外を引き起こした実際のイベントよりもはるかに遅くなるまで発生しない可能性があるため、これによりデバッグが難しくなる可能性があります。そのため、スティーブンのアドバイスに従い、タスクを保存して待機するか、後で別の場所で待機することをお勧めします。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

OkHttpを使用して複数の非同期リクエストを呼び出すと、コールバックが妨害されることがあります

分類Dev

タスク非同期呼び出しが返されないとデッドロックが発生する

分類Dev

バインドされていないメソッドは、インスタンスを最初の引数として呼び出す必要があります-python

分類Dev

バインドされていないメソッドは、インスタンスを最初の引数として呼び出す必要があります

分類Dev

インターフェイスを使用してコールバックメソッドが呼び出されることはありません

分類Dev

非同期呼び出しが必ずしも別のスレッドで実行されるとは限らない場合、非同期呼び出しをブロックするとデッドロックが発生する可能性がありますか?

分類Dev

バックグラウンドワーカー内で非同期のメディエーターデッドロックが待機しています-スレッドがそれ自体を呼び出していることを検出する方法

分類Dev

同期メソッドを呼び出すと、自然な非同期メソッドよりも速くタスクが完了します

分類Dev

asyncを使用してWebAPIに呼び出された非同期メソッドがスタックし、呼び出し元に戻らない

分類Dev

ReactpropメソッドがJestで呼び出されていないことをテストします

分類Dev

複数のタスクから呼び出されたパラメーターを使用した非同期メソッドが衝突を引き起こす

分類Dev

非同期メソッドC#のループ内で呼び出されるパラメーターとしてタスクを渡す

分類Dev

Moqで呼び出されることのないモック非同期メソッド

分類Dev

非同期メソッドが呼び出されていない

分類Dev

AbstractValidatorのValidateメソッドがValidatorFactoryBaseを使用して呼び出されることはありません

分類Dev

ソフトウェア全体で適切なパラメータを使用してメソッドが呼び出されることをテストします

分類Dev

onUpgradeメソッドが呼び出されることはありますか?

分類Dev

BrowserControlのScriptingObjectの非同期メソッドから動的コールバック関数を呼び出すと、例外がスローされます

分類Dev

非同期拡張メソッドを使用しているときにobservableが起動しないことをサブスクライブする

分類Dev

すべてのgetterメソッドが呼び出されていることを確認します

分類Dev

`-dealloc`内で呼び出された非同期メソッドは、不要なゾンビオブジェクトを生成する可能性があります

分類Dev

スタブされていないメソッドを呼び出すと、RuntimeExceptionをスローします。

分類Dev

awaitメソッドを置き換えることはできますか?非同期タスクの呼び出しで戻りますか?

分類Dev

n回呼び出されていることがわかっている場合は、非同期タスクが終了するのを待ちます

分類Dev

「この非同期メソッドには「待機」演算子がなく、同期して実行される」と心配する必要がありますか?警告

分類Dev

BeginInvoke()内で非同期メソッドを呼び出すと、「新しい」スレッドが生成されますか?

分類Dev

TypeError:バインドされていないメソッドparse()は、最初の引数としてElementTreeインスタンスを使用して呼び出す必要があります(代わりにstrインスタンスを取得しました)

分類Dev

バインドされていないメソッドequaldigits()は、最初の引数としてsutインスタンスを使用して呼び出す必要があります(代わりにintインスタンスを取得します)

分類Dev

エラー:バインドされていないメソッド「メソッド名」は、最初の引数として「クラス名」インスタンスを使用して呼び出す必要があります(代わりにclassobjインスタンスを取得しました)

Related 関連記事

  1. 1

    OkHttpを使用して複数の非同期リクエストを呼び出すと、コールバックが妨害されることがあります

  2. 2

    タスク非同期呼び出しが返されないとデッドロックが発生する

  3. 3

    バインドされていないメソッドは、インスタンスを最初の引数として呼び出す必要があります-python

  4. 4

    バインドされていないメソッドは、インスタンスを最初の引数として呼び出す必要があります

  5. 5

    インターフェイスを使用してコールバックメソッドが呼び出されることはありません

  6. 6

    非同期呼び出しが必ずしも別のスレッドで実行されるとは限らない場合、非同期呼び出しをブロックするとデッドロックが発生する可能性がありますか?

  7. 7

    バックグラウンドワーカー内で非同期のメディエーターデッドロックが待機しています-スレッドがそれ自体を呼び出していることを検出する方法

  8. 8

    同期メソッドを呼び出すと、自然な非同期メソッドよりも速くタスクが完了します

  9. 9

    asyncを使用してWebAPIに呼び出された非同期メソッドがスタックし、呼び出し元に戻らない

  10. 10

    ReactpropメソッドがJestで呼び出されていないことをテストします

  11. 11

    複数のタスクから呼び出されたパラメーターを使用した非同期メソッドが衝突を引き起こす

  12. 12

    非同期メソッドC#のループ内で呼び出されるパラメーターとしてタスクを渡す

  13. 13

    Moqで呼び出されることのないモック非同期メソッド

  14. 14

    非同期メソッドが呼び出されていない

  15. 15

    AbstractValidatorのValidateメソッドがValidatorFactoryBaseを使用して呼び出されることはありません

  16. 16

    ソフトウェア全体で適切なパラメータを使用してメソッドが呼び出されることをテストします

  17. 17

    onUpgradeメソッドが呼び出されることはありますか?

  18. 18

    BrowserControlのScriptingObjectの非同期メソッドから動的コールバック関数を呼び出すと、例外がスローされます

  19. 19

    非同期拡張メソッドを使用しているときにobservableが起動しないことをサブスクライブする

  20. 20

    すべてのgetterメソッドが呼び出されていることを確認します

  21. 21

    `-dealloc`内で呼び出された非同期メソッドは、不要なゾンビオブジェクトを生成する可能性があります

  22. 22

    スタブされていないメソッドを呼び出すと、RuntimeExceptionをスローします。

  23. 23

    awaitメソッドを置き換えることはできますか?非同期タスクの呼び出しで戻りますか?

  24. 24

    n回呼び出されていることがわかっている場合は、非同期タスクが終了するのを待ちます

  25. 25

    「この非同期メソッドには「待機」演算子がなく、同期して実行される」と心配する必要がありますか?警告

  26. 26

    BeginInvoke()内で非同期メソッドを呼び出すと、「新しい」スレッドが生成されますか?

  27. 27

    TypeError:バインドされていないメソッドparse()は、最初の引数としてElementTreeインスタンスを使用して呼び出す必要があります(代わりにstrインスタンスを取得しました)

  28. 28

    バインドされていないメソッドequaldigits()は、最初の引数としてsutインスタンスを使用して呼び出す必要があります(代わりにintインスタンスを取得します)

  29. 29

    エラー:バインドされていないメソッド「メソッド名」は、最初の引数として「クラス名」インスタンスを使用して呼び出す必要があります(代わりにclassobjインスタンスを取得しました)

ホットタグ

アーカイブ