我正试图找出解决这个问题的最佳方法。
我有一个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连接阻止。
本
答案 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取消它)并运行一个新计时器。