WinRT非同步任務取消的正確方法
在Windows 8 WinRT中,任務提供了執行非同步操作的機制。然而,處理任務取消可能很棘手。
考慮以下程式碼:
<code class="language-csharp">private async void TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.Token.Register(CancelNotification); source.CancelAfter(TimeSpan.FromSeconds(1)); var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token); await task; if (task.IsCompleted) { MessageDialog md = new MessageDialog(task.Result.ToString()); await md.ShowAsync(); } else { MessageDialog md = new MessageDialog("Uncompleted"); await md.ShowAsync(); } } private int slowFunc(int a, int b) { string someString = string.Empty; for (int i = 0; i < 1000000; i++) { someString += i.ToString(); } return a + b; }</code>
儘管呼叫了CancelNotification
方法,但任務仍在後台繼續運行並完成。為了在取消時完全停止任務,請遵循以下準則:
CancellationToken
傳遞給每個支援取消的方法。 CancellationToken
。 改進後的程式碼如下:
<code class="language-csharp">private async Task TryTask() { CancellationTokenSource source = new CancellationTokenSource(); source.CancelAfter(TimeSpan.FromSeconds(1)); Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); // (取消的任务在等待时会引发异常)。 await task; } private int slowFunc(int a, int b, CancellationToken cancellationToken) { string someString = string.Empty; for (int i = 0; i < 1000000; i++) { cancellationToken.ThrowIfCancellationRequested(); // 检查取消请求 someString += i.ToString(); } return a + b; }</code>
透過這些修改,如果任務在執行期間被取消,則該任務將完全取消,並在等待時引發異常。
以上是如何在WinRT中正確取消非同步任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!