1

我正在考慮在AsyncUIWinRT XAML Toolkit庫中爲等待擴展方法添加取消支持。看起來基本的Task類沒有內置的Cancel()方法或事件,並且依賴於取消標記,我的任務需要定期檢查。我認爲在我的UI場景中沒有任何意義,因爲我的任務是使用TaskCompletionSource生成的,我想取消UI線程上的任務以響應事件,而不是在線程池線程上運行循環,並檢查令牌。如何向異步UI任務添加取消支持?

當UI事件發生時,我的任務目前已完成 - 如故事板完成或單擊按鈕,所以如果我想支持取消 - 我需要通過取消訂閱事件和執行其他清理來響應取消請求動畫。

我想創建某種CancellableUITask基類而不是使用TaskCompletionSource,所以我可以公開一個我的任務的使用者可以調用的Cancel()方法(例如,爲了響應按鈕而停止等待的動畫點擊)以及類似虛擬OnCancellationRequested()方法的東西,我的故事板等待者任務可以覆蓋以執行清理。

它有道理嗎?完成我在這裏描述的內容的最佳方法是什麼?

+0

我不明白。您的解決方案如何比使用'CancellationToken'(可能使用['Register()'](http://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken.register)'來避免輪詢)和['TaskCompletionSource.SetCanceled()'](http://msdn.microsoft.com/zh-cn/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應該是好的。 –