2012-03-13 3 views
2

로드 중 작동하는 작업자 스레드 두 개가 인 WPF 응용 프로그램이 있습니다.특정 백그라운드 작업 스레드가 다른 백그라운드 작업 스레드보다 먼저 실행되도록하려면 어떻게해야합니까?

첫번째 ( BW1)은 어플리케이션 시작에서 산란되고, 일정 시간이 경과 한 후에 두 번째 ( BW2)이 산란된다.

은 내가 "worker_completed"첫 번째의 (BW1)에서 두 번째 배경 노동자 (BW2)을 산란 할 수없는 상황입니다.

현재, 나는 (기본 false) 클래스 수준 부울 변수를 가지고 있고, BW1 worker_completed 년대에 true을 설정합니다.

그리고 BW2의 시작에서

, 나는 위의 부울이 거짓이면 볼 수있는 검사가, 그렇다면, BW2은 100 밀리 초 동안 잠을 것입니다.

대부분이 작동합니다. 나는 그것을 향상시키고 싶다.

  • 나는 BW1BW2 잠 동안 실행되도록 BW1 (예를 들어, 같은 가장 높은로 설정)에서 스레드 우선 순위를 사용할 수 있습니까?

  • 이 목표를 달성 할 수있는 이벤트 중심 방식이 있습니까?

+0

내가 WPF하지만 작업자/스레드의 우선 순위를 모르는이 예약 작업에 사용해서는 안 : BW2의 코드 호출 ev.WaitOne()의 시작과 BW1의 work_completed 전화 ev.Set()으로는 BW2를 해제합니다. –

답변

4

바쁜 회전은 (심지어 수면) 이벤트가 발생할 때 맹목적으로 확인하고 불필요하게 시스템 리소스를 사용하고 있기 때문에 실제로, 모르는 나쁜 생각이다.

대신 AutoResetEvent을 사용하십시오.

AutoResetEvent ev = new AutoResetEvent(); 

// bw1's work completed  
private void bw1_workCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    ev.Set(); // release bw2 from waiting 
} 

// bw2's do work 
private void bw2_DoWork(object sender, DoWorkEventArgs e) 
{ 
    ev.WaitOne(); // wait for the signal from bw1 
    // code 
} 
+0

ev.WaitOne -> 그렇게하는 동안 bw1이 실행되는지 확인할 수 있습니까? – Relativity

+0

@Relativity :'ev.WaitOne'을 실행하면 스레드가 CPU에서 제거되고'ev.Set'이 호출 될 때까지 다시 스케줄되지 않습니다. 실질적으로 일시 중단되므로 bw1은 자유롭게 실행할 수 있습니다. – Tudor