わかりました、私は非同期/待機のすべてを理解したと思います。あなたが何かを待つときはいつでも、あなたが実行している関数が戻り、非同期関数が完了する間、現在のスレッドが何か他のことをすることを可能にします。利点は、新しいスレッドを開始しないことです。
Nodeがこれを実現するために多くのコールバックを使用することを除いて、Node.JSがどのように機能するかは多少異なるため、これを理解するのはそれほど難しくありません。しかし、これは私が利点を理解できないところです。
ソケットクラスには現在、Asyncメソッド(async / awaitで動作する)はありません。もちろん、ソケットをストリームクラスに渡し、そこで非同期メソッドを使用することもできますが、これでは新しいソケットの受け入れに問題が残ります。
私の知る限り、これを行うには2つの方法があります。どちらの場合も、メインスレッドの無限ループで新しいソケットを受け入れます。最初のケースでは、受け入れるすべてのソケットに対して新しいタスクを開始し、そのタスク内でstream.ReceiveAsyncを実行できます。ただし、タスクは他に何もすることがないので、awaitは実際にそのタスクをブロックしませんか?これもまた、スレッドプールでより多くのスレッドが生成される結果になりますが、これもタスク内で同期メソッドを使用するよりも優れていますか?
私の2番目のオプションは、受け入れられたすべてのソケットをいくつかのリストの1つ(スレッドごとに1つのリスト)に入れ、それらのスレッド内でループを実行し、すべてのソケットに対してawaitstream.ReceiveAsyncを実行することです。このようにして、awaitに遭遇するたびに、stream.ReceiveAsyncを実行し、他のすべてのソケットからの受信を開始します。
私の本当の質問は、これがスレッドプールよりも効果的かどうか、そして最初のケースでは、APMメソッドを使用するよりも本当に悪いかどうかだと思います。
また、await / asyncを使用してAPMメソッドを関数にラップできることも知っていますが、私が見る限り、async / awaitのステートマシンの余分なオーバーヘッドにより、APMメソッドの「デメリット」が発生します。