[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
|
メール
| |
VB2005のSocket通信サーバーの複数クライアントについて
1
:
名無しさん
:2010/09/21(火) 12:31:20
C#、VB2005のSocket通信サーバーの複数クライアントの非同期処理の
サンプルコードをDLして、ソケット通信のマルチ受信を行っている
のですが、「OnReadComplete」関数内で記載されている
「Thread.Sleep(20) 'これを入れないとNullReferenceExceptionが起きる」
という記載ですが、これを記載していても「networkStream.Close()」の
処理で「NullReferenceException」が発生していしまいます。
何が原因なのでしょうか?
2
:
igoten
:2010/09/21(火) 13:08:28
実行環境の違いでしょうかね。
Thread.Sleep(100);
位にして時間を長くしても同じですか?
3
:
名無しさん
:2010/09/22(水) 09:04:28
Sleepを色々変更しましたがだめでした。
処理として、OnReadComplete関数内でOracle(10.2.0.1)に接続し、
データを取得後、取得結果を返信するような作りにしていますが、
その部分が問題なのでしょうか?
ちなみに、NullReferenceException が発生すると何か障害があるのでしょうか?
また、セカンドスレッドで作成されるいかのクラス、
Dim handler As New ClientHandler(socketForClient, Me)
は、どの段階でメモリを解放されるのでしょうか?
特に気にする必要はないのでしょうか?
4
:
igoten
:2010/09/22(水) 10:12:36
>OnReadComplete関数内でOracle(10.2.0.1)に接続し..
OnReadCompleteが呼びだされている時はスレッドがブロックされています。
従ってOnReadComplete内では時間のかかる処理は出来ません。
Oracleを呼び出すような処理は別スレッドを作成してその中で行います。
>NullReferenceException が発生すると何か障害があるのでしょうか?
問題はどの処理の時に上記のエラーが発生するかです。
Sleepを入れてあるのはsocketをcloseするのに多少時間がかかって、
socket=nullでエラーが起きるためです。
socketが解放出来無い時何が起こるかはわかりません、リソースの使用が増える
ことは確かですが、それがガベージコレクションで解放されるのか否かと、
socketにどの位のリソースが食われるかは未確認です。
Sleepは止めてしまってタイマーなんかで相当時間を置いてからsoketを
解放する方が良いかもしれません。
>Dim handler As New ClientHandler(socketForClient, Me)
これらのインスタンスはガベージコレクションに任せておいて問題ないと
思います。
5
:
名無しさん
:2010/09/23(木) 12:05:25
>OnReadCompleteが呼びだされている時はスレッドがブロックされています。
スレッドがブロックされている状態というのは、他のスレッドが待ち状態になると
いうことでしょうか?
また、受信文字を取得後メインスレッドのテキストボックスに書き込んだ
後の以下の処理、
networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, Nothing)
は、なぜ必要なのでしょうか?
後、NullReferenceException が発生する場所は、
networkStream.Close()
を行った時に発生しているようです。
6
:
igoten
:2010/09/23(木) 12:30:34
ブロックされるのはそのスレッドだけです。
networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, Nothing)
は受信を再開するためですけどね。
Thread.Sleep(20)をnetworkStream.Close()の後に入れてみましたか?
7
:
名無しさん
:2010/09/23(木) 12:50:05
Thread.Sleep(20)をnetworkStream.Close()の後に変更することで
エラーは解消されました。
ありがとうございます。
networkStream.BeginReadは受信を再開するということですが、
この処理を行わないとどのようなことが起きるのでしょうか?
現在この部分をコメントアウトしても問題なく動いているように
見えるのですが?
8
:
igoten
:2010/09/23(木) 13:50:57
>コメントアウトしても問題なく動いているように
>見えるのですが?
その辺はSocketクラスの仕様によるんでしょうが、はっきりしません。
入れなくてもいいのかも知れませんね、参考にした
オライリー・ジャパンの「プログラミング C#」
には入っていたような気がします。
9
:
名無しさん
:2010/09/23(木) 15:18:36
色々とありがとうございました。
大変助かりました。
今後もなにかあればよろしくお願い致します。
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板