BeginReceive/BeginReadタイムアウト
-
28-09-2019 - |
質問
を使用していNetworkStream&TcpClientを非同期的にデータを受信用BeginRead.私は適応させる必要がある時にこの操作は、その後、指定された時間、読み込みが中断されました。
ていくこなサポートされてNetworkStreamはTcpClientあReceiveTimeout物件にのみ適用される同期に相当-'Read'.
でも、元のソケットクラスが表示されていない支援タイムアウトそのBeginReceive方法です。
私はこの問題のみが解っている設定のもうひとつの背景のスレッド操作を取消していない場合でも、完全にタイムアウト期間です。このような恐ろしいhack.はあるのではないでしょうかよりよい。
解決
相手にスペースを与えないことなので、たときの非同期操作には、スレッドを開始した運用は行いません。タイムアウトが利用可能な同期版での実行スレッドまで遮断され、読み込みオペレーションが完了します。
場合について背景のスレッド操作を取消しがんが大きい点に引き続き使用し、非同期開始-終了方法この場所でのスピンオフを背景に、スレッドで実行同期の読み込みオペレーションの背景をスレッドを利用することができるReceiveTimeout.
他のヒント
待 ManualResetEvent 一部のタイムアウト値信号の時あなたの仕事は終了しました。まる前にタイムアウトしたも示唆しているのをご存知の非同期操作のない完成します。
private ManualResetEvent receiveDone = new ManualResetEvent(false);
receiveDone.Reset();
socket.BeginReceive(...);
if(!receiveDone.WaitOne(new TimeSpan(0, 0, 0, 30))) //wait for 30 sec.
throw new SocketException((int)SocketError.TimedOut);
内BeginReceiveコールバック、使用
private void ReceiveCallBack(IAsyncResult ar)
{
/** Use ar to check if receive is correct and complete */
receiveDone.Set();
}
所属していません StackOverflow