2016-10-20 3 views
1

나는 이미 시작된 작업을 취소 한 다음 새 작업으로 동일한 작업을 다시 시작하는 방법을 찾고 있습니다.작업 취소

아래에 작성한 샘플 코드가 있지만 작동하지 않습니다.

private CancellationTokenSource _cancellationTokenSource; 
public public async Task DoSomething(string input) 
{ 
    _cancellationTokenSource.Cancel(true); 
    _cancellationTokenSource = new CancellationTokenSource(); 
    try 
    { 

     Task.Run(async() => 
     { 
      //Asynchronous method code here which uses input like database operations. 
      await doSomeDataBaseOperationAsync(input); 
     }, _cancellationTokenSource.Token); 
    } 
    catch { } 
} 

누군가 나를 도와 줄 수 있습니까?

+4

취소는 수작업으로 이루어진 것입니다. 취소가 요청되었는지 확인하려면 토큰 상태를 확인하고 실제로 취소해야하는 작업을 수행해야합니다. – Kilazur

+0

작동하지 않는 기능은 무엇입니까? 'DoSomething'을 호출하는 곳에서 간단하게'_cancellationTokenSource.Cancel (true);를 호출하면 작업을 취소 한 다음 다시 메서드를 호출 할 수 있습니다. 작동하지 않습니까? – RBT

+0

'cancellationTokenSource.Cancel (true);'이 코드는 초기화 전에 작동합니까? –

답변

-1

doSomeDataBaseOperationAsync 수동 검사를 수행해야합니다.이 코드는 아래의 코드 조각과 같이 비동기 적으로 실행됩니다. 내가 일반적으로하는 방법은 취소 토큰 소스의 상태를 메서드 자체가 시작될 때 한 번 확인하는 것입니다. 그 시간까지 취소가 요청되지 않으면 전체 기능 본문을 실행하십시오.

그러나 아무도 귀하의 방법 내에서 더 중요한 시점이나 이정표를 확인하지 못하도록 할 수 있습니다. DB 호출을 시작하기 전에 취소 토큰 상태를 한 번 다시 확인해야 할 수 있습니다.

주의 사항 : 메서드를 실행하는 동안 여러 번 검사를하고 중도로 돌아올 때마다 개체의 상태가 일관성없는 상태로 유지되지 않도록해야합니다 . 그런 방법으로 클래스의 멤버 변수를 변경하지 않으면 좋은 것입니다.

private void doSomeDataBaseOperationAsync(input) 
{ 
    if (_cancellationTokenSource.IsCancellationRequested) 
    return; //stop any further processing. 
    //do some processing and calculations on the client side 
    //..... 
    //..... 
    //..... 
    //make a check again before firing DB request 
    if (_cancellationTokenSource.IsCancellationRequested) 
    return; //stop any further processing. 
    //Do database stuff. cancellation has not been requested. Process the DB request. 
} 
+0

CancellationTokenSource.Cancel() 이벤트가 작업을 통해 전파됩니다. –

+0

취소 토큰이 제공된 상태에서 Task에서 이것을 확인하겠습니까? 자동으로 취소됩니다. 호출자가 비동기 모드에서 시작된 작업 취소를 확인해야합니다. –

+0

@SurajMittal 맞습니다. 바깥 쪽에서 'IsCancellationRequested'를 확인하십시오. –