3

呼び出し元と同じスレッドで非同期にメソッドを定義して呼び出すことは可能ですか? コアが 1 つしかなく、100 スレッドほどのスレッド管理のオーバーヘッドが必要ないとします。

編集 私が尋ねる理由は、物事を行うnodejsモデルです-1つのスレッド上のすべてが何もブロックしないため、非常に効率的であることが証明されたため、C#で同じことが可能かどうか疑問に思いました(そして、私はそれを自分で達成できませんでした)。

Edit2まあ、コメントノードで述べたように、結局のところシングルスレッドではありません(ただし、単純な負荷テストでは、コアが1つしか使用されていないことが示されています...)、非効率的なものだけを書くという暗黙の要件があると思います.ブロックコード。必須ではないことを除いて、C#で可能です:) とにかく、みんなありがとう...

この SO 投稿詳細情報と、この投稿の詳細

4

1 に答える 1

9

どのコンテキストについて話しているのか正確にはわかりませんが、C# 5 のasync/await機能は、この種のことをサポートするのに既に役立ちます。違いは、node.js ではすべてがデフォルトで強制的にシングル スレッド化されるのに対し (私が理解しているように、コメント内のリンクが誤って与えられている可能性が非常に高い)、非同期を使用する .NET のサーバー側アプリケーションは、非同期のスレッドをほとんど使用しないことです。それに自分自身を制限します。本当にすべてが1 つのスレッドで処理できるのであれば、その可能性は十分にあります。物理的な処理に関して複数の処理を行う必要がないのであれば、それで問題ありません。

しかし、あるリクエストが来て、別のリクエストがちょっとした作業をしているときにどうなるでしょうか? ほんの少しの暗号化などを行っているのかもしれません。最初のリクエストが完了するまで 2 番目のリクエストを待機させますか? もしそうなら、単一スレッドのスレッドプールに関連付けられた .NET でそれをかなり簡単にモデル化できTaskSchedulerます... しかし、より一般的には、.NET に組み込まれているスレッドプールを使用します。同時実行を許可します。

まず、.NET 4.5 を使用していることを確認する必要があります。これには、以前のバージョンの .NET よりもはるかに多くの非同期 API (データベースやファイル アクセスなど) があります。Task-based Asynchronous Pattern (TAP)に準拠した API を使用したい。次に、async/awaitを使用して、同期コードのように読み取りますが、実際には非同期で実行されるように、サーバー側コードを記述できます。たとえば、次のような場合があります。

Guid userId = await FetchUserIdAsync();
IEnumerable<Message> messages = await FetchMessagesAsync(userId);

これらの各操作が行われるまで「待機」する必要がありますが、スレッドをブロックせずに待機します。C# コンパイラは、ステート マシンの構築を処理します。頻繁にスパゲッティ コードになるコールバックを明示的に記述する必要はありません。コンパイラがすべて行います。

使用する Web/Web サービス フレームワークが非同期性をサポートしていることを確認する必要があります。残りの部分は、可能な限り少数のスレッドを使用して管理する必要があります。

上記の 2 つのリンクをたどって、C# 5 での非同期サポートの詳細を確認してください。これは大きなトピックであり、後でさらに質問があると思いますが、もう少し詳しく読んだら、質問できるはずです。現在の幅広い質問ではなく、非常に具体的な質問。

于 2013-04-27T19:22:10.807 に答える