- PR -

スレッドを使わずに非同期通信のタイムアウト処理って出来ますか

1
投稿者投稿内容
comba
会議室デビュー日: 2006/07/02
投稿数: 6
投稿日時: 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で送信しても同様な問題を抱えそうです。
ご存知の方いらっしゃいましたらどうぞ宜しくお願いいたします。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2006-08-08 20:36
「スレッド無しで」と「非同期通信で」がそもそも矛盾してますが。
comba
会議室デビュー日: 2006/07/02
投稿数: 6
投稿日時: 2006-08-08 22:04
レスありがとうございます。
説明が足りませんでした。「スレッド無しで」の意味は「非同期で次々と送信する」だけで、タイムアウト監視スレッドは無しで出来るかという意味でした。これも間違ってますでしょうか?
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2006-08-08 22:15
引用:

combaさんの書き込み (2006-08-08 22:04) より:
レスありがとうございます。
説明が足りませんでした。「スレッド無しで」の意味は「非同期で次々と送信する」だけで、タイムアウト監視スレッドは無しで出来るかという意味でした。これも間違ってますでしょうか?


つーか、それスレッドじゃねーわな。
タイマーでも使ったら?
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-08-08 22:34
引用:

combaさんの書き込み (2006-08-08 22:04) より:
説明が足りませんでした。「スレッド無しで」の意味は「非同期で次々と送信する」だけで、タイムアウト監視スレッドは無しで出来るかという意味でした。これも間違ってますでしょうか?


いったい何がだめで何がOKなのかなんでだめなのかさっぱり分かりませんが、
非同期で全部開始して、WaitAnyなりWaitAllなどでできないでしょうか?
どれかでエラーの場合(というかタイムアウトの場合)どうしたいのか分からないので
ちょっとなんともいえませんが。
※あでもキャンセルできないのかな…

そうか各スレッド作成して、タイムアウト設定した同期書き込みでやるか。
※監視スレッド???じゃないからOK???
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-08-08 23:37
 まず、「お客さんからスレッド無しでといわれている」、理由はなんでしょう?(「スレッド」そのものに拒否反応を示しているんじゃない?)しょうもない勘違いでそういう要求を出しているなら、正すのが System Enginer なり Solution Provider なりの仕事のひとつだと思うのですが、いかがでしょう?

 また、開いた直後にスリープして、読み込みが終わるのを待つのなら同期と同じじゃないですか?ってか、何をタイムアウトしたいのでしょう?Completed だから、通信処理の終了?それとも、通信のとっかかりがありさえすればいい?
 スレッドを(表向きは)使わなくとも、Windows.Forms.Timer なんてのもあるし、わざわざ寝る必要ないと思います。


むぅ。。Hongliangさんとぶさいくろうさんの、言葉かえただけだな、こりゃ。
1

スキルアップ/キャリアアップ(JOB@IT)