2016-06-15 2 views
0

:C#을 여러 작업에 작업의 실행을 취소 그것은 내가 예를 들어, 여러 작업이있는 작업을 취소하고 싶습니다

private async Task<bool> myTask0() { 
     var val2 = await myTask2(); 
     var val3 = await myTask3();    
     return true; 
    } 

여기서

private async Task<bool> myTask1() { 
     //run some tasks in paralell 
     var myParallel= arrayValues.Select(fileBEanListItem => manageSrcFilesDownload().ToList(); 
     return true; 
    } 

    private async Task<bool> myTask2() { 
     return await myTask3(); 
    } 

그래서 myTask0의 모든 작업을 취소 할 수있는 옵션을 제공하고 싶습니다. 중단하십시오!

내가 노력하고 있어요 : 해결책이 있습니까

var ts = new CancellationTokenSource(); 
CancellationToken ct = ts.Token; 

await Task.Factory.StartNew(async() => { 
       await myTask0(); 
     },ct); 

와 나는 닫을 필요가있을 때, 나는 ts.Cancel(true);하지만 효과는, 작업 어쨌든 실행되고 있지 사용합니다.

+2

취소 토큰은 일반적으로 외부 중단으로부터 요청되는 신호입니다. 그러나 루틴 내부에서 중단을 처리해야합니다. 적어도'BackGroundWorker'에서는 그렇습니다. [Here] (https://msdn.microsoft.com/de-de/library/dd997396(v=vs.110) .aspx)는 그 예입니다. 도움이 될 수 있습니다. –

+0

토큰을 메서드에 전달한 다음이를 확인하여 실행을 종료해야합니다. 이 게시물을 확인해보십시오. https://blogs.msdn.microsoft.com/dotnet/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in-async-apis/ – juharr

+0

A 취소 토큰은 강제 취소 할 수 없습니다. 작업 내에서 토큰을 수시로 검사하고 취소가 요청되면 작업을 종료해야합니다. – Enigmativity

답변

2

Cancellation is cooperative. 그래서, 당신은 당신의 방법을 통해 아래로 CancellationToken을 통과해야한다 : 당신이 당신의 자신의 코드를 가지고 때까지 당신이 (예를 들어, 파일 다운로드)를 취할 수있는 API에 토큰을 통과 할 때까지, 등등

private async Task<bool> myTask0(CancellationToken token) { 
    var val2 = await myTask2(token); 
    var val3 = await myTask3(token);    
    return true; 
} 

private async Task<bool> myTask1(CancellationToken token) { 
    //run some tasks in paralell 
    var myParallel= arrayValues.Select(fileBEanListItem => manageSrcFilesDownload(token).ToList(); 
    return true; 
} 

private async Task<bool> myTask2(CancellationToken token) { 
    return await myTask3(token); 
} 

그리고, 또는 취소에 응답하려면 CancellationToken.ThrowIfCancellationRequested 또는 CancellationToken.Register을 사용하십시오.

쪽지에는 StartNew is an anti-pattern입니다. 블로그에서 설명 하듯이 대신 Task.Run을 사용해야합니다. 특히, the CancellationToken parameter (for both StartNew and Run) only cancels the scheduling of the delegate; 그들은 코드를 중단하지 않습니다. 적절한 취소 지원을 위해서는 CancellationToken에 응답하는 코드를 작성해야합니다.

0

스티븐 클리어 리 이외에

MSDN 상태 : 작업 클래스에

는 취소는 취소 할 조작을 나타내는 사용자 대리자 및 취소를 요청하는 코드 사이의 협력을 포함한다. 성공적인 취소에는 요청 코드가 CancellationTokenSource.Cancel 메서드를 호출하고 사용자 대리자가 작업을 적절한 시점에 종료하는 작업이 포함됩니다.

관련 문제