2014-11-20 1 views
0

컬렉션에 바인딩 된 목록보기가 있습니다.Wpf Dispatcher 일시 중지 및 계속

항목이 목록보기에 점진적으로 추가되도록 dispatcher.current 발송자를 사용하여 모음이 업데이트됩니다.

Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
{ 
     if(continueDispatcher)numDone = DoStuff(); 
})); 

이 정말 잘 작동하고 continueDispatcher 플래그는 멋진 해당 트랙에서 죽은 스레드를 중지,하지만 난 버튼 클릭에 디스패처 작업을 계속 할 수 있도록하고 싶습니다.

디스패처 프레임 등을 읽었지만 작동하는 솔루션을 찾을 수없는 것 같습니다.

아무도이 문제에 대해 아이디어가 있습니까?

편집 - 더 코드

//for each image 
foreach (var result in results) 
{ 
    result.Type = type; 

    numDone = LoadImagesAsync(result, numDone, total); 
} 

private int LoadImagesAsync(Item result, int numDone, int total) 
{ 
    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() => 
    { 
     //keep looping 
     while (true) 
     { 
      //if the dispatcher is paused then continue the loop 
      if (DispatcherPaused) continue; 

      //if the dispatcher is not paused then perform the action and break out of the loop 
      numDone = DoStuff(result, numDone, total); 
      break; 
     } 
    })); 
    return numDone; 
} 

private int DoStuff(Item result, int numDone, int total) 
{ 
    ItemList.Add(result); 
    numDone++; 
    ProgressBarValue = ((double) numDone/total)*100; 
    return numDone; 
} 
  • C#
  • 비주얼 스튜디오 2012
+0

죄송합니다. 귀하가하려는 일을 이해하지 못했습니다. 그리고 그 깃발은 실에있는 실을 어떻게 멈추게합니까 *? – Dirk

+0

무한 루프에 넣지 않는 이유는 무엇입니까? – Bijan

+0

@Bizz 작동하지만 루프가 실행 중일 때 UI를 잠급니다. –

답변

1
Thread t = new Thread(() => 
{ 
    while (true) 
    { 
     if (continueDispatcher) 
      numDone = DoStuff(); 
     Thread.Sleep(50); 
    } 
}); 
t.Start(); 
+1

Application.DoEvents는 Windows Forms API입니다. 발송자가 큐를 처리하도록 강제하지 않으며 WPF 용으로 다시 구현하는 경우에도 여전히 반 패턴입니다. –

+0

@ Myke you correct 내가 첫 번째 방법을 삭제했습니다. – Bijan

1

첫째, 당신은 결코 블록 /이 같은 UI 스레드를 독점한다 . 장기 실행, 중단 가능한 작업을 관리하는 다른 방법을 찾아보십시오. 가능한 경우 BackgroundWorker을 사용하고 다른 스레드에서 대량 작업을 수행하고 UI 스레드로 마샬링하여 진행 상황을보고하고 결과를 커밋합니다 (한 번에 조금씩 또는 모두).

또한 작업을 '일시 중지'하려는 경우에는 루프로 통화 대기 중이 아닙니다. 그러면 지붕을 통해 CPU 사용량이 전송됩니다. 일반적으로 스레드가 다시 시작하도록 알릴 때까지 대기 상태로 스레드를 보내려면 일종의 대기 핸들을 사용해야합니다 (그러나 UI 스레드에는이 작업을 수행하지 마십시오).

관련 문제