저는이 문제를 해결하는 가장 좋은 방법을 찾으려고합니다.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 방법은 실행 -이 처음 만에 확인하고있다 이후 DispatcherTimer 틱의 내가 이전 스레드가 너무 폐쇄되지 RunWorkerAsync를 호출 할 때 나는
"이납니다 찾는거야 BackgroundWorker가 현재 사용 중이므로 여러 작업을 실행할 수 없습니다 동시에
이 작업을 수행하는 가장 좋은 방법은 무엇입니까?
더 좋은 방법이 있습니까?
편집 : 그것에 대해 생각해보십시오. 어떻게 든 워치 독을 구축 할 수 있다면 좋을 것입니다. 따라서 BackgroundWorker 스레드가 2 초 이상 실행되고 있으면 스레드가 TCP 연결에 의해 보류되었음을 나타내는 것처럼 종료됩니다. 첫 번째가 사용중인 경우에 (타이머가 두 번째로 틱 때 IsBusy
그래서, 당신은 단지 확인할 수 있습니다 : 노동자를 사용할 수없는 경우
벤
DispatcherTimer를 구성하는 방법과 DoEvents 메서드의 내용을 게시하면 도움이됩니다. –
일부 코드가 추가되었습니다. – Ben
Tick 이벤트 처리기에서 타이머를 중지하고 RunWorkerCompleted 이벤트 처리기에서 다시 시작하십시오. 또는 그것이 의미가있는 경우 새로운 BGW를 만드십시오 (드물게). –