0

ソケットで常にブロックし、すべてを読み取ってから再度ブロックし、さらに待機しているスレッドがあります。これは、応答を取得し、要求を行ったさまざまなスレッド/ウィンドウにそれらを渡す役割を担う非同期通信プロトコルの一部です。また、「まだ生きていますか?」、タイムアウトメッセージなどへの応答も処理します。私が探しているのは、メソッド呼び出しでこのループをシャットダウンする方法です。私はそれが必要です。

ソケットで待機しているスレッドのブロックを解除するようにかつて言われた方法は、ソケットで別の何かに Close を呼び出すことですが、私はそれをしたくありませんが、開いたままにしたいと思います。私が過去にこれを処理した Kludgier の方法は、ソケットのブロックをオフにして、間隔を置いてスリープ状態にするか、ソケットのタイムアウトを設定してループを維持することでしたが、どちらもポーリングの形式であり、私が何か避けたい。

おそらく、イベントを使用してそれを行う方法がいくつかあります。ソケットにデータがあるときにスローされるイベントはありますか?

4

3 に答える 3

3

残念ながら、非同期 I/O プログラミングは (どの言語でも) 正しく行うのが最も難しいものの 1 つです。Windows では、典型的なアプローチはI/O 完了ポートと呼ばれるものを使用することです。

さいわい、.NET では、保留中の操作がソケットで完了したことを通知する方法として非同期イベントをサポートする Socket クラスによって、これがいくらか単純化されます。AsyncSocketEventArgsのMSDN ドキュメントには、まともな例があります。

詳細については、CodeProject.comのC# Sockets Async Eventsを参照してください。

于 2012-04-27T01:22:11.183 に答える
1

ソケットを開いたままにしたい場合、データを待っているスレッドを中断したいのはなぜですか? このスレッドが彼のソケットを待機するだけでなく、他のこともできる場合は、次のことができます。

1) 'hEvent' 待機ハンドル + WaitForMultipleObjects、完了ルーチン、またはフル IOCP のいずれかを使用して、オーバーラップ I/O を使用します。

2) すべての非ブロッキング オン ソケット アクティビティを、ハンドル配列で WFMO を待機している別のスレッドに移動します。そのうちの 1 つは、ブロッキング読み取りのみを実行しているスレッドから通信しています。

ブロッキング呼び出しで待機している 1 つのスレッドをクローズせずにブロック解除する必要がある場合は、データを送信するように手配できます。ソケットでエコー要求をピア クライアント/サーバーに送信します。次に応答し、待機中の rx スレッドのブロックを解除します。

于 2012-04-27T08:37:43.937 に答える
0

Thread.Interrupt を使用できます。ブロッキング呼び出しは、処理が必要な ThreadInterruptedException で返されます。

ここで例を見つけることができます

于 2012-04-27T01:27:50.447 に答える