1

AsyncUIWinRT XAML Toolkit 라이브러리의 기다릴 수있는 확장 메서드에 취소 지원을 추가하고자합니다. 기본 Task 클래스에는 기본 제공 Cancel() 메서드 또는 이벤트가 없으며 내 작업에서 주기적으로 확인해야하는 취소 토큰을 사용합니다. UI 태스크 시나리오에서는 TaskCompletionSource를 사용하여 태스크를 생성 했으므로 스레드 풀 스레드에서 루프를 실행하고 토큰을 확인하는 대신 이벤트에 응답하여 UI 스레드에서 태스크를 취소하고 싶습니다. .비동기 UI 작업에 취소 지원을 추가하는 방법은 무엇입니까?

스토리 보드 완료 또는 버튼 클릭과 같은 작업이 현재 완료되어 있으므로 취소 작업을 지원하려면 이벤트 취소 및 다른 중지 작업을 수행하여 취소 요청에 응답해야합니다. 애니메이션.

저는 TaskCompletionSource 대신 CancellableUITask 일종의 클래스를 만들려고합니다. 그래서 내 작업의 소비자가 호출 할 수있는 Cancel() 메서드를 노출 할 수 있습니다 (예 : 버튼에 대한 응답으로 기다려온 애니메이션을 중지하려면) click) 및 스토리 보드 작업이 정리를 수행하도록 재정의 할 수있는 가상 OnCancellationRequested() 메소드와 같은 것입니다.

의미가 있습니까? 내가 여기서 묘사 한 것을 성취하는 최선의 방법은 무엇인가?

+0

:

그래서 당신의 코드를 다음과 같이 보일 수 있습니다. 폴링을 피하기 위해'CancellationToken' (아마도''Register()'] (http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.register)을 사용하는 것보다 당신의 솔루션이 더 나은 방법은 없을 것입니다) 및 ['TaskCompletionSource.SetCanceled()'] (http://msdn.microsoft.com/en-us/library/dd449188)? – svick

+0

글쎄, 나는 등록 방법을 몰랐다. 그래서 나는 묻고있다. :) –

답변

1

작업을 정기적으로 확인하지 않아도 취소가 가능합니다. 이는 일을하는 가장 일반적인 방법입니다. 작업이 이벤트 기반 일 경우 취소 될 때 호출 될 CancellationToken에 대해 처리기를 등록 할 수 있습니다. CancellationToken.Register을 참조하십시오. 이해가 안

public Task DoSomethingAsync(CancellationToken cancellationToken = default(CancellationToken)) 
{ 
    var tcs = new TaskCompletionSource(); 

    if (cancellationToken.CanBeCanceled) 
    { 
     // register for notification of cancellation 
     cancellationToken.Register(...); 
    } 

    // set up other handlers and what-not 

    return tcs.Task; 
} 
+0

그것이 작동하는지 나는 알 것이다. 나는 내 모든 방법에 또 다른 과부하를 추가 할 필요가 있다는 것에 너무 만족스럽지 않아 좀 더 복잡해 보입니다. 나는 서브 클래 싱 작업이 더 잘 작동 할 수 있다고 생각하고 있었다. 어떤 이유로 든 나쁜 생각 일 수 있다고 생각합니까? –

+0

@Filip : 어떤 추가 과부하가 필요합니까? 'CancellationToken'을위한 선택적 매개 변수를 사용 했으므로 여분의 과부하가 필요하지 않습니다. –

+0

선택적 매개 변수가 뒤에서 새로운 오버로드를 생성한다고 생각 했습니까? 어쨌든, 난 그냥 내 방법을 쳐다 보면서 너무 매개 변수별로 복잡하지 않으므로 CancellationToken에 대한 또 다른 하나는 OK 여야합니다. –

관련 문제