2012-06-01 12 views
25

この単純な質問に対する答えを見つけるのに妥当と思われる以上に多くの時間を費やした後、私は結果をここに残して、他の人がすべてのフープと間違ったパス私はちょうど続いた。TcpClientを正しく使用する方法ReadTimeout

問題は、TcpClient ReadTimeoutプロパティを使用して、読み取り操作が実際にタイムアウトした場合、Microsoftはソケットを閉じることにしました。これは、私が知っている他のソケット実装では行なわれていない、望ましくない、望ましくないことではなく、プログラマの怠惰以外のケースであるべき正当な理由もありません。しかしこれはMicrosoftが選択したものです。

とにかく、このサイトを含めて私が見つけたすべての回避策には、多忙なポーリングを行うさまざまな方法がありましたが、単純な読み取り呼び出しを実行する別のスレッドを開始することさえありました。私は申し訳ありませんが、私はそこに座っているよりも私のCPUともっと良いことを持っています。そして、特に多くのソケットが開いているので、これは私にとってはオプションではありません。結局のところ、これは忙しい投票がちょうどあなたが物事をした方法だった1990年代初頭ではありません。今日では、割り込みを使用してこれらのタイプのものを非常に効率的に処理するオペレーティングシステムと呼ばれるものがあります。

とにかく、私はこの古いブログ記事につまずいさらに別の接線をサーチ:

http://blogs.msdn.com/b/mflasko/archive/2006/02/20/535655.aspx

MSDNブログ>マイクFlaskoさんのブログ>ネットワークデータを

キーテイク遠かっ読み込むときのタイムアウトの処理読み取りタイムアウトを適切に処理する方法の解決策を教えてください:

この時点で、例外をキャッチすることがあります同じNetworkStream上で読み取りを再発行します。この戦略によって予期しないエラーが発生する可能性があります。これを行うには、NetworkStream(ソケット)を不安定な状態として扱うことが最善の方法です。これは、基本となるスタックがタイムアウトすると、基になるI/O読み取りがキャンセルされるためです。データが同時に入力されると、データが失われ、データストリームが破損します。

及び溶液:

より良いアプローチ必要に応じて、例外をキャッチソケットまたはれるtcpClientを閉じて再接続することです。

私はまだこれがAPIの利用者に不必要な負担をかけると思いますが、少なくともそれが最も適切な解決策である私は、私が何を把握しようと見てサイトの数十の外に見つけることができました準正当なソケットReadTimeout。

この質問/コメントが誰かを見つけてくれた時間を節約してくれることを願っています。

+0

私はその原料で取り組んできましたまた、1000msにタイムアウトを設定して例外をキャッチした場合、送信が本当に終わったか、ネットワークに問題があるかどうかを判断するのがかなり難しいため、いくつかの手順が遅れることがあります。例えば、私はネットワーク上でPNG画像を送信するコードの一部を持っています。コードはwhile(true){tryを試してデータを受信し、例外時に4096バイトのバッファが破棄されます。データがない場合は中断してください。 }私は1msのスレッドスリープを入れない場合、(私はそれが吸うことを知っている)dataavailableは、あまりにもすぐにfalseを返し、画像が裂けてしまいます。 – Felype

+0

これは質問ですか?あなたが自分の質問に答えていても、Q&A形式であればこれがはるかに良くなるような気がします。 –

+0

タイトルが質問です。私は確かに質問をし、別の回答で答えることができたが、代わりにこのようにした。これは私が尋ねようとしていた元の質問でしたが、ポストボタンを押す前に、私は十分な研究をすべきだと思っていました。しかし、私は少し努力していくことがどれほどの時間を要するか分かりませんでした。その過程で、私は自分自身の質問に答えました。受け入れられる解決策を見つけるまでには時間がかかりましたので、他の人が私がしなければならないすべての時間を繰り返さなくても済むようにするのがいいと思っていました。 – Dunk

答えて

関連する問題