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. 所以准备好尝试\catch AllUsersWorker.RunWorkerAsync()call。

于 2011-10-28T12:14:46.310 回答
0

要知道该工人是否有空,您可以查看该物业:IsBusy

因此,当计时器第二次计时,您可以检查第一个是否忙(在这种情况下,您可以使用 CancelAsync 取消它)并运行一个新的。

于 2011-10-28T11:40:43.060 回答