WinRT における信頼性の低いタスクキャンセルへの対処
CancelNotification
を使用して WinRT タスクを停止することは信頼性が低い場合があります。メソッドは成功したように見えても、タスクは実行を続けます。 これにより、キャンセルを試行してもタスクのステータスが完了してしまうことがよくあります。
強力なキャンセルアプローチ
解決策は、.NET のキャンセルとタスクベースの非同期パターン (TAP) を理解することにあります。 TAP では、非同期メソッド内で CancellationToken
を使用することをお勧めします。 重要な手順は、すべてのキャンセル可能なメソッドに CancellationToken
を渡し、それらのメソッド内に定期的なチェックを組み込むことです。
改善されたコード例:
この改訂されたコードは、await
:
<code class="language-csharp">private async Task TryTask() { var source = new CancellationTokenSource(); source.CancelAfter(TimeSpan.FromSeconds(1)); var task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token); try { // Await the task; an exception is thrown if cancelled. await task; } catch (OperationCanceledException) { // Handle cancellation gracefully. Console.WriteLine("Task cancelled successfully."); } } private int slowFunc(int a, int b, CancellationToken cancellationToken) { string someString = string.Empty; for (int i = 0; i < 1000000; i++) { someString += i.ToString(); // Simulate long-running operation cancellationToken.ThrowIfCancellationRequested(); } return a + b; }</code>
このコードは次のように CancellationToken
を利用します:
await task
は、タスクがキャンセルされた場合に OperationCanceledException
をスローします。 この例外はキャッチされて処理されます。cancellationToken.ThrowIfCancellationRequested()
は、キャンセル リクエストを定期的にチェックします。slowFunc
ThrowIfCancellationRequested
されたタスクを確実にキャンセルできるようになり、バックグラウンド プロセスが防止され、より堅牢なソリューションが提供されます。await
以上がWinRTでお待ちの課題を確実にキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。