2011-08-24 3 views
0

다음과 같은 문제가 있습니다. 꽉 루프를 내 WPF 응용 프로그램의 MainWindow.cs 클릭 이벤트를 시작합니다.중첩 된 Parallel.For 루프 - 취소. 시도가 작동하지 않습니다.

이제 다른 버튼에 의해 트리거 된 중지 이벤트는 긴밀한 루프를 중지하고 작업을 종료해야합니다.

내 꽉 루프에서 나는 Parallel.For 루프가 있습니다. 아이디어는 내가 동시에 (Parallel.For)와 이것을 반복해서 (꽉 루프) 일정량의 일을해야한다는 것입니다. 이것이 최선의 접근 방법인지는 모르겠지만 그것이 가지고있는 유일한 방법입니다. :)

아무 것도하지 않는 것 같은 Cancellation.Token에 문제가 있습니다. 루프를 중지하고 작업을 올바르게 끝내려면 어떻게합니까?

var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext(); 
CancellationToken token = cts.Token; 

ParallelOptions po = new ParallelOptions(); 
po.CancellationToken = cts.Token; 
po.MaxDegreeOfParallelism = System.Environment.ProcessorCount; 

Task dlTask = Task.Factory.StartNew( 
() => 
{ 
    do 
    { 
    Parallel.For(0, num, po, i => { 
     if (!token.IsCancellationRequested) 
     { 
     // do work 
     } 
    }); 
    } 
    while (!token.IsCancellationRequested); 

}, token, TaskCreationOptions.LongRunning, TaskScheduler.Default); 

dlTask.ContinueWith(prev => 
{ 
    //clean up 
}, uiScheduler); 

내가 po.CancellationToken.IsCancellationRequested로와하지 않고 그것을 시도하고 멈추지 않았다 :

여기 내 코드입니다.

private void btnStop_Click(object sender, RoutedEventArgs e) 
{ 
    if (cts.IsCancellationRequested || po.CancellationToken.IsCancellationRequested) 
    { 
    cts.Cancel(); 
    } 
} 

UPDATE : Damien_The_Unbeliever에 솔루션 덕분에 :

private void btnStop_Click(object sender, RoutedEventArgs e) 
{ 
    cts.Cancel(); 
} 
+0

제목 줄에 "(C#)"등을 쓰지 말고 태그를 사용하십시오. –

+0

죄송합니다, 태그에 또한 추가했습니다. – user774326

답변

2

당신은 당신의 정지 버튼의 이벤트 핸들러에서 cts.Cancel()를 호출해야합니다. 그러면 취소 요청을 취소했음을 취소 토큰에 알립니다.

+0

고맙습니다. 코드를 추가하는 것을 잊었습니다. 봐. 나는 당신이 제안한 바를 – user774326

+0

@ user774326라고 생각합니다 -'btnStop_Click' 메쏘드 안에있는 당신의 조건은 취소가 이미 요청되었을 때만'Cancel'을 호출한다는 것을 의미합니다 ... –

+0

Yipee ... 지금은 고맙습니다. 한 가지 더 작업을 어떻게 다시 시작해야합니까! 즉, 사용자가 다시 시작을 클릭하면 전체 프로세스가 다시 시작됩니다. 거짓 유형의 재설정 재설정 토큰 요청이 있습니까 ?? – user774326