私はこれに取り組むための最良の方法を見つけようとしています。
タイマーでソケット接続を行うために使用されているBackgroundWorkerがあります。
Public Shared AllUsersWorker As New BackgroundWorker
Public Shared AllUsersWorkerTimer As New DispatcherTimer
AllUsersWorkerTimer.Interval = TimeSpan.FromSeconds(2)
AllUsersWorkerTimer.Start()
AddHandler AllUsersWorkerTimer.Tick, AddressOf All_Users_Worker_Timer_Tick
Public Shared Sub All_Users_Worker_Timer_Tick()
AllUsersWorker.RunWorkerAsync()
End Sub
Public Shared Sub AllUsersWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
tcpClient = New TcpClient
tcpClient.Connect("localhost", 9999)
networkStream = tcpClient.GetStream
If networkStream.CanWrite And networkStream.CanRead Then
Read_All_Connections()
End If
tcpClient.Close()
End Sub
TCP接続を確立するBackgroundWorkerスレッドを開始し、データの読み取り/書き込みを行ってから、接続を閉じて2秒ごとに繰り返します。
接続しているサーバーがデータを送信せず、readByte呼び出しがデータの待機を停止し、プログラムをリセットするまでプロセスを続行できないため、毎回物理的に接続を開閉したい(したがって、 UIとは別のスレッドを使用したい)。
現時点では、2秒間隔でDispatcherTimerを使用してWorker.RunWorkerAsyncを呼び出そうとしています。RunWorkerAsyncが呼び出されると、DoEventsメソッドが実行されます-これは初めて正常に機能しますが、後続のDispatcherTimerティックでは、前のスレッドが閉じていないことがわかります。そのため、RunWorkerAsyncを呼び出すと次のようになります。
「このBackgroundWorkerは現在ビジーであり、複数のタスクを同時に実行することはできません」
これを達成するための最良の方法は何ですか?
もっと良い方法はありますか?
編集:それについて考えます。どういうわけかウォッチドッグを組み込むことができれば良いので、BackgroundWorkerスレッドが2秒以上実行されていることがわかった場合、スレッドがtcp接続によって保留されていることを示しているため終了します。
ベン