1

私はこれに取り組むための最良の方法を見つけようとしています。

タイマーでソケット接続を行うために使用されている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接続によって保留されていることを示しているため終了します。

ベン

4

2 に答える 2

1

は実際にはワーカーを自動キャンセルしませんが、これは、コード条件がそれをチェックしてから戻ることができるように、および\またはの呼び出しBackgroundWorker.CancelAsyncに入るフラグであり、それによって手動で作業自体をキャンセルします。DoWork(object sender, DoWorkEventArgs e)e.Cancel = trueBackgroundWorker.CancellationPendingDoWork()

これはMSDNが言うことです...

ワーカーコードは、CancellationPendingプロパティを定期的にチェックして、trueに設定されているかどうかを確認する必要があります。

自動キャンセルの場合はThread.Abort()呼び出しがありますが、がスローされる場合がありThreadAbortExceptionます。だから、\catchcallを試す準備をしてくださいAllUsersWorker.RunWorkerAsync()

于 2011-10-28T12:14:46.310 に答える
0

ワーカーが利用できないかどうかを知るには、プロパティを確認できます。IsBusy

したがって、タイマーが2回目になるときは、最初のタイマーがビジーであるかどうかを確認し(この場合、CancelAsyncを使用してキャンセルできます)、新しいタイマーを実行できます。

于 2011-10-28T11:40:43.060 に答える