2016-10-05 4 views
-1

私はSerialPortクラスイベントがUIスレッドとの同期呼び出しを持っていることを調べました。私はとポートを切断するときので、DataReceivedイベントのために私のコードですSerialPort.Write(String)問題:UIスレッドとの同期呼び出しを持っています

Delegate Sub DataRXPointer(ByVal Buffer As String) 

'########### Data Receive Handler ########### 
Private Sub COMPort_DataReceivedHandler(sender As Object, e As SerialDataReceivedEventArgs) Handles COMPort.DataReceived 
    Me.BeginInvoke(New DataRXPointer(AddressOf handleDataRX), COMPort.ReadExisting) 
End Sub 

しかし、問題はSerialPort.Write(String)メソッドであり、以下に、UIスレッド上でBeginInvokeをDataReceivedイベントとデリゲートを使用していましたアプリケーション(私はルータをオフに切り替えることを意味する)、UIスレッドがハングアップします。私はWriteTimeout値を5000(5秒)に割り当て、tryとcatchブロックでTimeoutExceptionをキャッチしました。それでもUIスレッドが約25-30秒間ハングすると、例外が発生し、ポートを破棄して閉じます。

WriteTimeout = 5000  '// 5-sec 
    ReadTimeout = 5000  '// 5-sec 

    Try 
     If COMPort.IsOpen Then 
      COMPort.Write(dataToSend) 
     End If 

    Catch ex As TimeoutException 
     If COMPort IsNot Nothing Then 
      COMPort.Dispose() 
      COMPort.Close() 
     End If 

     Me.Close() 

    End Try 

約25-30秒までハングアップしているので、このメソッドもUIスレッドとの同期呼び出しを持っていると推測します。シリアルポートをUIスレッドと同期させないようにするソリューションはありますか?このシリアルポートクラスを使って、別のスレッドで完全に動作させる方法を教えてください。

答えて

0

私は、30-35秒間このハングが実際のポートドライバのためだと分かりました。ドライバとの接続を切断するのに30〜35秒かかります。ドライバがステータスを「再接続中」に変更すると、アプリケーションは通常通りにジョブを解放します。

関連する問題