使用DistpatcherTimer重复BackgroundWorker任务

时间:2011-10-28 10:56:36

标签: wpf vb.net backgroundworker dispatchertimer

我正试图找出解决这个问题的最佳方法。

我有一个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

我想启动BackgroundWorker线程,该线程建立TCP连接,读取/写入一些数据,然后关闭连接并每2秒重复一次。

我希望每次物理打开/关闭连接,因为我正在连接的服务器不时发送数据而readByte调用暂停等待数据并且进程无法继续直到我重置程序(因此想要在我的UI中使用不同的线程)。

目前我正在尝试使用Interpat为2秒的DispatcherTimer来调用Worker.RunWorkerAsync。当调用RunWorkerAsync时,DoEvents方法运行 - 这是第一次正常工作,但是在随后的DispatcherTimer tick上我发现前一个线程没有关闭所以当调用RunWorkerAsync时我得到了

  

“此BackgroundWorker当前正忙,无法运行多个任务   同时“

我能做到这一点的最佳方式是什么?

有更好的方法吗?

编辑:思考它。如果我可以以某种方式构建一个监视程序,那将是很好的,所以如果发现BackgroundWorker线程运行超过2秒,它就会终止,因为这表明该线程已被tcp连接阻止。

2 个答案:

答案 0 :(得分:1)

BackgroundWorker.CancelAsync并没有真正自动取消工作人员,但这只是DoWork(object sender, DoWorkEventArgs e)调用e.Cancel = true和\或BackgroundWorker.CancellationPending的标志,因此代码条件可以检查并从DoWork()返回,从而手动取消工作本身。

这是MSDN所说的......

  

工作人员代码应定期检查CancellationPending   属性,看它是否已设置为true。

对于自动取消,有Thread.Abort()次呼叫,但可能会抛出ThreadAbortException。所以准备尝试\ catch AllUsersWorker.RunWorkerAsync()来电。

答案 1 :(得分:0)

要知道工人是否不在,您可以查看房产:IsBusy

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