お世話になっております。
現在ソケット通信を行うプログラムを作成しており、
アプリケーション終了時にソケット通信で電文送信を行う処理をコーディングしています。
電文送信直後にSocketクライアントをクローズすると処理が速すぎて送信ができないため、
Timerでスリープ処理を行いたいと思っています。
しかし下記コードを実行するとスリープは行われるのですが、
一通り処理が通った後にFormDesinersクラスで下記の例外が発生します。
System.InvalidOperationException' のハンドルされていない例外が
System.Windows.Forms.dll で発生しました。追加情報: CreateHandle() の実行中は値 Dispose() を呼び出せません。
スレッドが関係しているような気がするのですが、原因がつかめません。
対策方法があればご教示いただければ幸いです。
//コードは何か所か省略しています。Formクラスの記述です。 SocketSendClass listening; // スレッド利用する接続待ち用兼電文送信用クラス private void Form1_FormClosed(object sender, FormClosedEventArgs e) { // サーバアプリを終了するにもかかわらず、接続待ちスレッドを終了していない場合の処理 if (SLTAlive) { if (listening.ClientSocket != null) { //電文を送信 listening.send(true, true); } //1秒後にchangeBtnTimeAfterメソッドを実行 System.Threading.Timer timer = new System.Threading.Timer(Close, null, 1000, 0); } } private void Close(Object state) { if (listening.ClientSocket != null) { // Socketクライアントをクローズ listening.ClientSocket.Shutdown(SocketShutdown.Both); listening.ClientSocket.Close(); listening.ClientSocket = null; } if (ServerSocket != null) { // 接続要求受け入れの終了 ServerSocket.Close(); } // 念のためスレッドをnull設定 StartListeningThread = null; // スレッド終了指示フラグを終了に設定 SLTAlive = false; }
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/24 10:28