どのコードが実際に非同期/待機パターンで「マルチスレッド」で実行されますか?

andresantacruz

このコードでは:

public async Task v_task()
{
    await Task.Run(() => Console.WriteLine("Hello!"));
}

public async void v1()
{
    await v_task();
    // some other actions...
}

public void ButtonClick()
{
    v1();

    Console.WriteLine("Hi!");
}

ButtonClickが呼び出された場合、非同期/待機によって生成された下位スレッドプールで実際に並行して実行される上記のメソッドはどれですか?

つまり、async / awaitで動作する競合状態についての私の懸念は何ですか?すべての非同期メソッドは、同じ呼び出し元のスレッドで必須に実行されますか?可能な共有状態でミューテックスを使用する必要がありますか?はいの場合、共有状態オブジェクトをどのように検出できますか?

スティーブン・クリアリー

ButtonClickが呼び出された場合、非同期/待機によって生成された下位スレッドプールで実際に並行して実行される上記のメソッドはどれですか?

Console.WriteLineのみTask.Run

つまり、async / awaitで動作する競合状態についての私の懸念は何ですか?

実際にどのように機能するかを説明している私のasyncイントロを読むことから始めることをお勧めしますawait

要約すると、asyncメソッドは通常、シリアル非同期方式で記述されますこのコードを例にとってみましょう。

CodeBeforeAwait();
await SomeOtherMethodAsync();
CodeAfterAwait();

CodeBeforeAwaitそれSomeOtherMethodAsync最初に完了まで実行され、次に呼び出されるといつでも言うことができます。次に、メソッドは(非同期で)SomeOtherMethodAsync完了するの待ち、その後でのみCodeAfterAwait呼び出されます。

したがって、シリアル非同期です。期待どおりにシリアルに実行されますが、そのフロー内の非同期ポイント(await)でも実行されます。

さて、あなたはすることができないと言うCodeBeforeAwaitと、CodeAfterAwait多くの文脈がないわけではない、少なくとも、同じスレッド内で実行されます。awaitデフォルトでは、現在SynchronizationContext(またはTaskSchedulerSyncCtxがない場合は現在)で再開します上記のサンプルメソッドはUIスレッドで実行されたのであれば、あなたがいることを知っているだろうCodeBeforeAwaitCodeAfterAwaitUIスレッドで実行されます両方。ただし、コンテキストなしで(つまり、バックグラウンドスレッドまたはコンソールメインスレッドから)CodeAfterAwait実行された場合は、別のスレッドで実行される可能性があります。

メソッドの一部が別のスレッドで実行されている場合でも、ランタイムはメソッドを続行する前にバリアを配置するので、変数アクセスをバリアする必要がないことに注意してください。

また、元の例ではTask.Run、スレッドプールに作業を明示的に配置するを使用していることに注意してくださいこれはasync/とはかなり異なり、awaitマルチスレッドとして扱う必要があります。

可能な共有状態でミューテックスを使用する必要がありますか?

はい。たとえば、コードでがを使用している場合はTask.Run、それを別のスレッドとして扱う必要があります。(注していることawait、それはだ多くの他のスレッドとすべてではない共有状態に簡単に-あなたは純粋なあなたのバックグラウンドタスクを保つことができれば、彼らはとの仕事に非常に簡単です)。

はいの場合、共有状態オブジェクトをどのように検出できますか?

他の種類のマルチスレッドコードと同じ答え:コード検査。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

.Netネイティブのスレッドプールで実行される非同期タスクのパフォーマンスが非常に低い

分類Dev

実装するインターフェースが非同期の場合、「この非同期メソッドには「await」演算子がなく、同期的に実行されます」という警告を抑制するにはどうすればよいですか?

分類Dev

非同期/待機コードが期待どおりに実行されない

分類Dev

非同期またはマルチスレッドコードでのコールバックの実行をテストする

分類Dev

Linuxで非同期シグナルハンドラーはどのように実行されますか?

分類Dev

別のスレッドで非同期コードを同期的に実行する

分類Dev

シングルトンパターンで、2つ以上のスレッドが同時に実行されるとどうなりますか?

分類Dev

Kotlin-コルーチンスコープ、非同期が実行されないのはなぜですか?

分類Dev

非同期メソッドがシングルスレッドの場合、バックグラウンドでどのように実行できますか?

分類Dev

1つの@Asyncメソッドで使用されるスレッドプールが他の非同期メソッドの実行と共有されます

分類Dev

待機継続で同じスレッドを維持しながら、ネストされた非同期/待機コードを並行して実行するにはどうすればよいですか?

分類Dev

非同期コードがC#のワーカースレッドで実行される理由

分類Dev

非同期コードが実行されている場合、Promiseエグゼキューターコールバックはどこにありますか?

分類Dev

非同期クラスがAndroidで実行される前にUIスレッドが実行されます

分類Dev

スレッドのような重機を使わずに、RubyでJSスタイルの非同期/ノンブロッキングコールバックを実行しますか?

分類Dev

「非同期」は別のスレッドで実行されますか?

分類Dev

どのスレッド非同期操作が実行されるか

分類Dev

インターフェースメソッドの戻り値(パラメーターなし)は非同期で取得されます。実装できますか?

分類Dev

非同期/待機データベースの挿入が成功した場合にのみ一部のJavaScriptコードが実行されるようにするにはどうすればよいですか?

分類Dev

マルチスレッド時にPyQtコードが完全に実行されないのはなぜですか?

分類Dev

スプレッドシートから一連のターミナルコマンドを実行するにはどうすればよいですか?

分類Dev

JAVAコンパレータがエラーをスローします(マルチスレッド実行)

分類Dev

PowerShell /バッチファイルのネットワークパスからコマンドを実行するにはどうすればよいですか

分類Dev

laravelキュー-同期ドライバーはどのように機能しますか?分離されたプロセスまたはメイン実行スレッドで実行されますか?

分類Dev

このコードは非同期で実行されていますか?

分類Dev

Scala Futuresはスレッドでどのように動作しますか?そして、それらをどのように使用して、非同期および非ブロッキングコードを実行できますか?

分類Dev

非同期コードが非同期で実行されないのはなぜですか?

分類Dev

非同期タスク内でのさまざまなコマンドの実行

分類Dev

バックグラウンドスレッドでセマフォを使用して同時に実行される非同期コルーチンを制限する

Related 関連記事

  1. 1

    .Netネイティブのスレッドプールで実行される非同期タスクのパフォーマンスが非常に低い

  2. 2

    実装するインターフェースが非同期の場合、「この非同期メソッドには「await」演算子がなく、同期的に実行されます」という警告を抑制するにはどうすればよいですか?

  3. 3

    非同期/待機コードが期待どおりに実行されない

  4. 4

    非同期またはマルチスレッドコードでのコールバックの実行をテストする

  5. 5

    Linuxで非同期シグナルハンドラーはどのように実行されますか?

  6. 6

    別のスレッドで非同期コードを同期的に実行する

  7. 7

    シングルトンパターンで、2つ以上のスレッドが同時に実行されるとどうなりますか?

  8. 8

    Kotlin-コルーチンスコープ、非同期が実行されないのはなぜですか?

  9. 9

    非同期メソッドがシングルスレッドの場合、バックグラウンドでどのように実行できますか?

  10. 10

    1つの@Asyncメソッドで使用されるスレッドプールが他の非同期メソッドの実行と共有されます

  11. 11

    待機継続で同じスレッドを維持しながら、ネストされた非同期/待機コードを並行して実行するにはどうすればよいですか?

  12. 12

    非同期コードがC#のワーカースレッドで実行される理由

  13. 13

    非同期コードが実行されている場合、Promiseエグゼキューターコールバックはどこにありますか?

  14. 14

    非同期クラスがAndroidで実行される前にUIスレッドが実行されます

  15. 15

    スレッドのような重機を使わずに、RubyでJSスタイルの非同期/ノンブロッキングコールバックを実行しますか?

  16. 16

    「非同期」は別のスレッドで実行されますか?

  17. 17

    どのスレッド非同期操作が実行されるか

  18. 18

    インターフェースメソッドの戻り値(パラメーターなし)は非同期で取得されます。実装できますか?

  19. 19

    非同期/待機データベースの挿入が成功した場合にのみ一部のJavaScriptコードが実行されるようにするにはどうすればよいですか?

  20. 20

    マルチスレッド時にPyQtコードが完全に実行されないのはなぜですか?

  21. 21

    スプレッドシートから一連のターミナルコマンドを実行するにはどうすればよいですか?

  22. 22

    JAVAコンパレータがエラーをスローします(マルチスレッド実行)

  23. 23

    PowerShell /バッチファイルのネットワークパスからコマンドを実行するにはどうすればよいですか

  24. 24

    laravelキュー-同期ドライバーはどのように機能しますか?分離されたプロセスまたはメイン実行スレッドで実行されますか?

  25. 25

    このコードは非同期で実行されていますか?

  26. 26

    Scala Futuresはスレッドでどのように動作しますか?そして、それらをどのように使用して、非同期および非ブロッキングコードを実行できますか?

  27. 27

    非同期コードが非同期で実行されないのはなぜですか?

  28. 28

    非同期タスク内でのさまざまなコマンドの実行

  29. 29

    バックグラウンドスレッドでセマフォを使用して同時に実行される非同期コルーチンを制限する

ホットタグ

アーカイブ