したらば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」が発生していしまいます。
何が原因なのでしょうか?

2igoten: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)
は、どの段階でメモリを解放されるのでしょうか?
特に気にする必要はないのでしょうか?

4igoten: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()
を行った時に発生しているようです。

6igoten:2010/09/23(木) 12:30:34
ブロックされるのはそのスレッドだけです。

networkStream.BeginRead(buffer, 0, buffer.Length, callbackRead, Nothing)
は受信を再開するためですけどね。

Thread.Sleep(20)をnetworkStream.Close()の後に入れてみましたか?


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板