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 中国語 Web サイトの他の関連記事を参照してください。