0

仕事を待つサーバー上にスレッドを作成したい。サイトにアクセスするユーザーごとに 1 つのスレッドが必要です。thead.sleep(100) を使用して while ループを作成すると機能しますが、効率的ではないようです。各訪問者に属する各タスクを追跡して、winform 関連オブジェクトにアクセスできるようにします。

スレッドが必要なのは、何年もの間 winforms を使用しており、多くのコードがコード ビハインド フォームにあるためです。そのため、ユーザーごとに MainForm のインスタンスを起動し、ユーザーがサイトにアクセスしている間、それをメモリに保持する必要があります。html の UI はかなり馬鹿げていて、ソケットが提供するシグナル (メッセージボックスを開く、小さなフォームを開くなど) に応答するだけです。たとえば、メッセージボックス (yes/no) の場合、サーバーはプロセスを続行する前にユーザーの選択を待つ必要があります。

最初の悪い設計により、機能し、高速なこのアプローチを採用せざるを得なくなりました。待機ループをより良いもの (より簡単/高速) に置き換えたいだけです。開発に1年余分にかかるので、完全にやり直すことはできません

おそらくrx.NETが役立つかもしれませんが、私はそれを知りません。

ここに関連する答えがいくつかありますが、明らかではありません。

ありがとう

フェリックス

4

1 に答える 1

1

私があなたの質問を誤解している場合は訂正してください。ただし、ユーザーが問題の呼び出しを行うと、潜在的に長い I/O が発生する可能性があると理解しています。

なんらかの結果を待っているだけの場合、スレッドは適切な選択ではありません。追加のスレッドを作成することは、ほとんどの場合、CPU バウンドの作業には適していますが、何かが起こるのを待っているだけの場合、スレッドを使用する利点はあまり明確ではありません。

これをある種の非同期またはノンブロッキング I/O に置き換える必要があります。

この事実についての私の標準的な説明は次のとおりです。10 人でレストランに行くとします。ウェイターが来たとき、彼が注文を求めた最初の人は準備ができていません。しかし、他の9人はそうです。したがって、ウェイターは他の 9 人に注文を求め、それまでに注文する準備ができていることを期待して元の人に戻ります。(元の男が注文する準備が整うのを待つために2人目のウェイターを獲得することは絶対にありません。そうしても、おそらく時間の節約にはなりません)。多くの場合、async/await はこのように機能します (例外は、Thread.Run(...) などの Task Parallel ライブラリ呼び出しの一部が実際に他のスレッドで実行されていることです。 which is which のドキュメントを確認してください)。

複数のウェイターが必要になるのは、真に「ウェイターに縛られている」タスク (つまり、ウェイターがタスクの主要なホールドアップになる場合) です。たとえば、レストランに 100 のテーブルがある場合、1 人のウェイターがすべてのテーブルにサービスを提供しようとするのは賢明ではありません。また、ウェイターが注文を受けてから料理を準備するのも賢明ではありません。このような場合は、別の人に料理を作ってもらい、複数のウェイターを配置する必要があります。最終的には、複数のクックやバスボーイなどが必要になるかもしれません。これは、複数のスレッドがある場合です。一般に、スレッドは特殊な役割 (ウェイター、バスボーイ、料理人など) を務め、特定のカテゴリに適合する作業を「分割」します (たとえば、各ウェイターは複数のテーブルを処理します)。

ただし、特定のアプリケーションでは、各ユーザーを処理するために新しいスレッドを作成する場合でも、ブロックを可能にするManualResetEventクラスなど、andを使用して結果を継続的にポーリングするよりも、必要なことを行うためのはるかに優れた方法があります。特定のイベントが発生するまで、スレッド (またはスレッドのグループ) を保持します (したがって、ポーリング ループが不要になります)。whileThread.Sleep

于 2016-09-29T16:44:12.923 に答える