2011-10-28 4 views
1

저는이 문제를 해결하는 가장 좋은 방법을 찾으려고합니다.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

그래서, 당신은 단지 확인할 수 있습니다 : 노동자를 사용할 수없는 경우

+0

DispatcherTimer를 구성하는 방법과 DoEvents 메서드의 내용을 게시하면 도움이됩니다. –

+0

일부 코드가 추가되었습니다. – Ben

+0

Tick 이벤트 처리기에서 타이머를 중지하고 RunWorkerCompleted 이벤트 처리기에서 다시 시작하십시오. 또는 그것이 의미가있는 경우 새로운 BGW를 만드십시오 (드물게). –

답변

1

BackgroundWorker.CancelAsync 나던 정말 노동자를 자동-취소하지만하여 수동으로 작업 자체를 취소 e.Cancel = true 및 \ 또는 코드 조건을 확인하고 DoWork()에서 돌아갈 수 있도록 BackgroundWorker.CancellationPending로 THER DoWork(object sender, DoWorkEventArgs e) 호출에 와서 단지 플래그입니다 .

MSDN의 말씀입니다 ...

작업자 코드는 주기적으로 true로 설정되어 있는지 확인하기 위해 CancellationPending에게 속성을 확인해야합니다.

자동 취소의 경우 Thread.Abort() 전화가 있지만 ThreadAbortException이 표시 될 수 있습니다. 그래서 try \ catch AllUsersWorker.RunWorkerAsync() 호출을 준비하십시오.

0

는 속성을 확인할 수 있습니다 알고 어떤 경우에는 CancelAsync를 사용하여 취소 할 수 있습니다) 새 것을 실행하십시오.

+0

방금 ​​해봤습니다. IsBusy는 두 번째로 참이지만, CancelAsync를 호출한다고해서 죽이는 것처럼 보이지는 않습니다. – Ben

+0

CancelAsync()는 백그라운드 작업자에서 "CancellationPending"속성을 true로 설정하기 만하면 해당 속성을 확인하고 DoEvents가 끝날 때까지 종료해야합니다. 나는 VB를하지는 않지만 웹상에서 많은 예제를 찾을 수있을 것이라고 확신한다. –

+0

취소 중이거나 사용이 중지 될 때까지 기다리는 것이 작동하지 않습니다. 그건 교착 상태라고. –