私はこれにアプローチする最善の方法を見つけようとしています。DistpatcherTimerを使用してBackgroundWorkerタスクを繰り返す
タイマーでソケット接続を行うために使用されている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関数メソッドが実行されます - これが初めてOK働いたが、その後のDispatcherTimer目盛りの上でされて、私は
「これを取得していますRunWorkerAsyncを呼び出すときに、以前のスレッドがそれほどクローズされていません見つけますよBackgroundWorkerは現在ビジー状態であり、複数のタスクを同時に実行することはできません 同時に "
これを達成するにはどうすればよいですか?
良い方法がありますか?
編集:考えてみてください。どうにかしてウォッチドッグを構築できればいいと思うので、BackgroundWorkerスレッドが2秒以上実行されていれば、スレッドがtcp接続によって保持されていることを示すので、終了します。労働者が利用できない場合は、プロパティを確認することができます知っている
ベン
DispatcherTimerの設定方法とDoEventsメソッドの設定について説明します。 –
いくつかのコードを追加しました。 – Ben
Tickイベントハンドラでタイマーを停止し、RunWorkerCompletedイベントハンドラでそれを起動してください。それが意味をなさない場合は、新しいBGWを作成します(まれにしか行いません)。 –