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中文网其他相关文章!