- - PR -
非同期ソケットでの受信タイムアウト設定方法について
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-04-14 19:57
ちょっと調べてみたらこんなのありましたが参考になりますか?
http://www.microsoft.com/japan/msdn/enterprise/pag/diforwc-ch06.asp 内の【待機アプローチの使用】あたり
な感じのをデータを受け取って処理する部分に入れれば出来るような気がしますね。 でも、.NETもっていないから実験できません | ||||||||||||
|
投稿日時: 2006-04-14 21:28
BeginAcceptやBeginReceiveのコールバック関数内の処理が非常に時間のかかる処理であり、同時に数十のクライアントに対応する必要があるのであれば、確かに枯渇(と言うか最大数を超えた分がキューで待機)してしまいますね。 ただ、今回はコールバック関数内の処理にそれほど時間のかからない物なので、その辺りは考慮しなくてもいいのかな、と考えていました。 問題ありな考え方だったかもです。 本当に大量(一万超とか)のスレッドを短期間に生成・破棄を繰り返すことさえなければ、スレッドを(プールを使用せず)生成・破棄してもリソースに多大な影響を与える事はないと考えてよいだろう、という事なんですね。 今回は、素直に接続ごとにスレッドを起動して処理しようかと思います。 しかしながら、非同期メソッドを使いつつタイムアウトを処理する方法が気になってしまいます。 今回考えているようなアプリケーションの場合は、そんな処理は不要だとは分かったのですが、そんな処理が必要になるアプリケーション(どんな物かは思いつかないものの)の場合はどうするのか……。 識者の方々に伺いたいような、伺ってもまだ理解できないような。
待機アプローチ、初めて知りました。有難うございます! 進行状況を表示したりする場合はこれを使うものなんですね、勉強になります。 確かに、色々とこねくりまわしたコードを書いたら、何となく処理ができそうな気がします。 今検証できないので何ともあれな回答で申し訳ありません……。 非同期メソッドを使いつつタイムアウトを処理する方法については、まだチャレンジしていきたいので、前に自分が提示した方法と待機アプローチを用いた方法と両方で検証してみようと思います。 上述しましたが、識者の方々、もしよろしければ引き続きご教示下さい。 同期・非同期やマルチスレッド、ソケット通信について、初心者に取っ掛かり易いお薦めの本やサイト等がありましたらこれも教えて頂けると大変有難いです。 | ||||||||||||
|
投稿日時: 2006-04-16 13:11
普通、こういう場合に、タイムアウトを検出するために待つ手段としては、直接「スレッド」を使うのではなく、「タイマー」を使います。タイマーの内部実装としてスレッドを使うことになるだろうとは思いますが、アプリケーションプログラムからはタイマーだけを使います。悪い出来でないタイマーのクラスならば、スレッドのプーリングなども普通に管理してくれるだろうと思います。
私は .NET のタイマーはあまり良く知らないのですが、 http://www.atmarkit.co.jp/fdotnet/dotnettips/373threadtimer/threadtimer.html の3つのどれかを使えば良いのではないでしょうか。 System.Threading.Time が良い? なお、タイマーイベントがファイアされた中で、長時間かかる処理を複数、同時に処理したい時はその中であらためてスレッドを生成することになります。無駄かもしれませんが、切り分けとしてはこのほうがキレイです。 _________________ -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} |