- - PR -
スレッドを使わずに非同期通信のタイムアウト処理って出来ますか
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-08-08 18:12
はじめまして。非同期通信でタイムアウト処理について教えてください。
非同期の通信処理でデータを送信しています。これにタイムアウトの機能をつけたいのですが、出来ればスレッドを使用したくありません。 現状の処理はこのようなものです。 String str = "sample..."; Byte[] bData = Encoding.Unicode.GetBytes(str); TcpClient sender = new TcpClient(); sender.Connect(IpAddr,port); NetworkStream stream = sender.GetStream(); IASyncResult iar = stream.BeginWrite(bData,0,bData.Length, new ASyncCallback(writeCallback),stream); // タイムアウトのチェック ここでは10秒 int i; for (i=0;i<10000;i+=10) { if (iar.IsCompleted == true) break; Thread.Sleep(10) //10ミリ秒休止 } if (i == 10000) stream.EndWrite(iar); //強制的に終了 // call back private void writeCallBack(IASyncResult iar) { // エラーチェック } 送信先が1つならば、これでいいと思うのですが、複数存在します。その場合はこのロジックをスレッドにしてあげる必要があると思うのですが、いかがでしょうか?(この程度なら同期のタイムアウトを使ったほうがコードが簡単になると思いますが...) 但しお客さんからスレッド無しでといわれているので、単純に非同期でどんどん処理をしてどこかでタイムアウトのExceptionなどあがればいいのですが、コールバックもどうやら送信完了時にしかコールされないようなので、どうすればよいかわかりません。 Socketで送信しても同様な問題を抱えそうです。 ご存知の方いらっしゃいましたらどうぞ宜しくお願いいたします。 | ||||
|
投稿日時: 2006-08-08 20:36
「スレッド無しで」と「非同期通信で」がそもそも矛盾してますが。
| ||||
|
投稿日時: 2006-08-08 22:04
レスありがとうございます。
説明が足りませんでした。「スレッド無しで」の意味は「非同期で次々と送信する」だけで、タイムアウト監視スレッドは無しで出来るかという意味でした。これも間違ってますでしょうか? | ||||
|
投稿日時: 2006-08-08 22:15
つーか、それスレッドじゃねーわな。 タイマーでも使ったら? | ||||
|
投稿日時: 2006-08-08 22:34
いったい何がだめで何がOKなのかなんでだめなのかさっぱり分かりませんが、 非同期で全部開始して、WaitAnyなりWaitAllなどでできないでしょうか? どれかでエラーの場合(というかタイムアウトの場合)どうしたいのか分からないので ちょっとなんともいえませんが。 ※あでもキャンセルできないのかな… そうか各スレッド作成して、タイムアウト設定した同期書き込みでやるか。 ※監視スレッド???じゃないからOK??? | ||||
|
投稿日時: 2006-08-08 23:37
まず、「お客さんからスレッド無しでといわれている」、理由はなんでしょう?(「スレッド」そのものに拒否反応を示しているんじゃない?)しょうもない勘違いでそういう要求を出しているなら、正すのが System Enginer なり Solution Provider なりの仕事のひとつだと思うのですが、いかがでしょう?
また、開いた直後にスリープして、読み込みが終わるのを待つのなら同期と同じじゃないですか?ってか、何をタイムアウトしたいのでしょう?Completed だから、通信処理の終了?それとも、通信のとっかかりがありさえすればいい? スレッドを(表向きは)使わなくとも、Windows.Forms.Timer なんてのもあるし、わざわざ寝る必要ないと思います。 むぅ。。Hongliangさんとぶさいくろうさんの、言葉かえただけだな、こりゃ。 |
1