2010-06-12 6 views
8

나는를보고 루프를 통해 WebClient.DownloadString을 호출하여 웹 사이트를 다운로드했다. 나는 사용자가 물건을 다운로드하는 도중에 취소 할 수있는 옵션을 원했기 때문에 CancellationPending이 루프 중간에 있었을 때마다 CancelAsync라고했다.어떻게 BackgroundWorker를 일시 중지 할 수 있습니까? 또는 이와 비슷한 것

하지만 지금은 DownloadString이라는 기능이 일부 얼어 붙어서 DownloadStringAsync (이 모든 것은 BackgroundWorker으로 생성 된 다른 스레드 내부) 대신 사용하기로 결정했습니다. 그리고 나는 루프와 함수를 호출하여 호출 한 후에 루프와 함수를 끝내야하므로 루프를 만들었지 만 아무 것도하지 않고 변수를 확인한 후에 while 루프를 만들었습니다. bool StopDownloadStringCompleted 이벤트 핸들러가 호출되거나 사용자가 작업 취소를 요청한 경우

이상한 점은 디버그 버전에서 잘 작동한다는 것입니다. 하지만 릴리스 1에서는 프로그램이 주 스레드 인 것처럼 while 루프에서 멈 춥니 다.

답변

4

나에게 소리가 들리면 잠시 기다리십시오. 대신 이벤트 신호를 사용해야합니다. WaitHandle. 릴리스 모드에서의 busy-waiting 루프는 여러분의 CPU를 모두 잘 소비하여 동결감을 줄 수 있습니다.

DownloadStringCompleted의 WaitHandle에 신호를 보내거나 사용자가 다운로드를 취소 한 경우 신호를 보냅니다.

WaitHandle 클래스의 MSDN docs을 확인하십시오. 거기에 예제가 있습니다. 내가 그것을 누를 때, pauseWorker (글로벌 변수 또는 속성)가 true가되어에서 루프 것을

int icounter = 1; 
while (icounter < SomeListInventory.Count) 
      { 
       while (pauseWorker == false) 
       { 
        //----------------------- 
        //DO SOME WORK 
         icounter++; 
        //----------------------- 
       } 
      } 

그리고 난, 버튼 일시 정지를하는 동안

+0

WaitHandle은 완벽하게 작동합니다. 고맙습니다! – Juan

+0

백그라운드 작업자의 일시 중지/다시 시작 루프 http://stackoverflow.com/questions/8359058/pause-resume-loop-in-background-worker –

0

잠시 동안 잠자기 취소를 확인하는 while 루프를 보냅니다. (몇 ms). 이렇게하면 다른 스레드 및 프로세스에 대한 CPU 런타임을 확보 할 수 있습니다.

+1

바쁜 대기는 나쁜 습관입니다. –

+0

나는 WaitHandle과 같은 것이 C#/.Net (항상 배워야 할 새로운 것들 :-)이라는 것을 알지 못했다. 그러나 때로는 폴링 만이 유일한 해결책이다. 그리고 폴링 만 프로세스가 폴링하는지 확인해야한다. 한 번 검사 한 다음 OS가 스레드/프로세스에 부여한 CPU 시간 (Linux에서는 yield() 함수)을 포기합니다. – Mark

+0

WaitHandles 또한 타임 아웃과 함께 사용되어 폴링을 방지 할 수 있습니다. :) (그리고 현명 할 때까지 바쁜 대기를하면서 사용했습니다.) –

0

좋은 주제, 난 내 배경 작업자 프로세스에서 두 번 을 사용 첫 번째 만, iicounter를 늘리지 않고, 그리고 내가 pauseworker = false로 다시 만들 때 프로세스가 계속됩니다.

관련 문제