非同期の動作は新しいスレッドで待機します

Dabloons

async / awaitの正確な動作を理解しようとしていますが、頭を包むのに少し問題があります。

この例を考えてみましょう。

public async void StartThread()
{
    while(true){
        SomeOtherClass.SomeSynchronousStuff();
        var something = await SomeOtherClass.SomeOtherAsyncMethod();
    }
}

public void ConstructorForThisClass()
{
    Thread thread = new Thread(StartThread);
    thread.Start();
}

async / awaitについての私の理解は、内部で起こっていることは、コンパイラーが本質的にコードを一連のコールバックに変換し、それぞれの状態オブジェクトを格納しているということです。

したがって、これによると、私の質問は次のとおりです。

  1. 新しく作成されたスレッドは非同期で実行されますか?つまり、スレッドが待機している間、スレッドはSomeOtherAsyncMethod解放されて他の作業に取り掛かることができますか?
  2. 上記が当てはまる場合、スレッドは単に終了し、SomeOtherAsyncMethod戻ったときにスレッドプールスレッドが代わりになりますか?
  3. StartThreadマネージスレッドではなくスレッドプールスレッドで関数を発行するにはどうすればよいですか?
  4. 待機可能なメソッドが呼び出し元に戻ったとき、それを呼び出すスレッドで再開することを強制されますか、それとも任意の空きスレッドが代わりになりますか?
ユヴァル・イチャコフ

新しく作成されたスレッドは非同期で実行されますか?

あなたの言い回しは少し問題があります。スレッド作成は完全に同期しています。

つまり、スレッドがSomeOtherAsyncMethodを待機している間、スレッドは解放されて他の作業に取り掛かることができますか?

スレッドThreadプールスレッドではなくクラスを使用して手動でスレッドを作成していますAppDomain内では共有されません。それはされます、それは最初のヒット後に解放されawaitたキーワードを、しかし、あなたは無限にそれを使用するため、whileループ、それはそれ以外の他の作業のために使用されません。

上記が当てはまる場合、SomeOtherAsyncMethodが戻ったときに、スレッドは単に終了し、スレッドプールスレッドが代わりに使用されますか?

前者を無視すると、を使用しないためConfigureAwait(false)、継続は任意のThreadPoolスレッドで実行されます。しかし、それは本当に文脈に依存します。このデリゲートを新しいスレッドで実行しているので、それが起こります。ただし、たとえば、これをUIスレッドから実行した場合、継続は、関連TaskSchedulerする対応する介してUIメッセージループにマーシャリングしようとしますSynchronizationContext

マネージスレッドではなくスレッドプールスレッドでStartThread関数を発行するにはどうすればよいですか?

Threadクラスとクラスによって開始されたすべてのスレッドThreadPool管理対象スレッドです。「スレッドプールでこのデリゲートを実行するにはどうすればよいですか」という意味の場合、答えは静的クラス経由Task.RunまたはThreadPool静的クラス経由です。

待機可能なメソッドが呼び出し元に戻ったとき、それを呼び出すスレッドで再開することを強制されますか、それとも任意の空きスレッドが代わりになりますか?

なしConfigureAwait(false)実行された場合、それは現在TaskSchedulerおよびその基礎となるに強制されSynchronizationContextます。これは、UIメッセージループ内で実行し、awaitそこで呼び出すと、継続を投稿しようとすることを意味します。TaskScheduler使用可能なカスタムない場合は、デフォルトのスレッドプールスケジューラが使用されます。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

マングースの静力学は非同期で動作しておらず、待機しています

分類Dev

Typescript非同期はFSで動作しないのを待っています

分類Dev

非同期メソッドが終了しますまで、メインスレッドを待機する方法は?

分類Dev

非同期メソッドは互いに待機します

分類Dev

どのようにJavaの非同期に動作しますか?非同期メソッドは非同期で実行していないようです

分類Dev

非同期関数は待機しないで待機します

分類Dev

NodeJSで非同期メソッドを待機しています

分類Dev

GraphQL#executeはすべてのDataFetcherを同じスレッドで実行しますか?非同期動作はDataFetcher実装に委任されていますか?

分類Dev

予期しない待機/非同期動作

分類Dev

なぜメインスレッドが完了するまでに、他の非同期プロセス(スレッド)を待っていません。ALLOFFが正常に動作していません

分類Dev

非同期を排除し、非同期メソッドで待機します

分類Dev

スタックを介した非同期/待機動作

分類Dev

非同期I / O操作が保留中であっても、io_serviceを処理するスレッドのみが待機しています

分類Dev

非同期メソッドは待機していません

分類Dev

スレッドプールが望ましくない場合の非同期/待機の処理

分類Dev

非同期メソッドで完了したタスクを待機しています

分類Dev

別のスレッドで非同期/待機する利点はありますか?

分類Dev

非同期メソッドの待機はバックグラウンドで何をしますか?

分類Dev

ノードはpromise.allで非同期/待機します

分類Dev

非同期タスクが作業を終了するまで待機します

分類Dev

タスクは非同期で待機します

分類Dev

AndroidのIntentServiceで非同期コールバックを待機しています

分類Dev

2つの非同期タスクを待機しています

分類Dev

スレッドプーリングはどのように機能し、NodeJSのような非同期/待機環境に実装するのですか?

分類Dev

ノードJは非同期関数内で機能しないのを待っています

分類Dev

非同期でのFirebaseイメージのアップロードは待機します

分類Dev

スレッドプールの完了ポートスレッドは、.NET / .NETCoreの非同期I / O中にどのように動作しますか?

分類Dev

非同期はelasticsearchの検索/スクロールで待機します

分類Dev

非同期メソッドが「serialPort = await SerialDevice.FromIdAsync()」を待機しないのはなぜですか?

Related 関連記事

  1. 1

    マングースの静力学は非同期で動作しておらず、待機しています

  2. 2

    Typescript非同期はFSで動作しないのを待っています

  3. 3

    非同期メソッドが終了しますまで、メインスレッドを待機する方法は?

  4. 4

    非同期メソッドは互いに待機します

  5. 5

    どのようにJavaの非同期に動作しますか?非同期メソッドは非同期で実行していないようです

  6. 6

    非同期関数は待機しないで待機します

  7. 7

    NodeJSで非同期メソッドを待機しています

  8. 8

    GraphQL#executeはすべてのDataFetcherを同じスレッドで実行しますか?非同期動作はDataFetcher実装に委任されていますか?

  9. 9

    予期しない待機/非同期動作

  10. 10

    なぜメインスレッドが完了するまでに、他の非同期プロセス(スレッド)を待っていません。ALLOFFが正常に動作していません

  11. 11

    非同期を排除し、非同期メソッドで待機します

  12. 12

    スタックを介した非同期/待機動作

  13. 13

    非同期I / O操作が保留中であっても、io_serviceを処理するスレッドのみが待機しています

  14. 14

    非同期メソッドは待機していません

  15. 15

    スレッドプールが望ましくない場合の非同期/待機の処理

  16. 16

    非同期メソッドで完了したタスクを待機しています

  17. 17

    別のスレッドで非同期/待機する利点はありますか?

  18. 18

    非同期メソッドの待機はバックグラウンドで何をしますか?

  19. 19

    ノードはpromise.allで非同期/待機します

  20. 20

    非同期タスクが作業を終了するまで待機します

  21. 21

    タスクは非同期で待機します

  22. 22

    AndroidのIntentServiceで非同期コールバックを待機しています

  23. 23

    2つの非同期タスクを待機しています

  24. 24

    スレッドプーリングはどのように機能し、NodeJSのような非同期/待機環境に実装するのですか?

  25. 25

    ノードJは非同期関数内で機能しないのを待っています

  26. 26

    非同期でのFirebaseイメージのアップロードは待機します

  27. 27

    スレッドプールの完了ポートスレッドは、.NET / .NETCoreの非同期I / O中にどのように動作しますか?

  28. 28

    非同期はelasticsearchの検索/スクロールで待機します

  29. 29

    非同期メソッドが「serialPort = await SerialDevice.FromIdAsync()」を待機しないのはなぜですか?

ホットタグ

アーカイブ