ホームページ > バックエンド開発 > C++ > WinRTで非同期タスクを適切にキャンセルする方法は?

WinRTで非同期タスクを適切にキャンセルする方法は?

Susan Sarandon
リリース: 2025-01-26 12:41:11
オリジナル
220 人が閲覧しました

How to Properly Cancel Asynchronous Tasks in WinRT?

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 メソッドが呼び出されているにもかかわらず、タスクはバックグラウンドで実行され続け、完了します。キャンセル時にタスクを完全に停止するには、次のガイドラインに従ってください:

  • Pass cancelanceToken: キャンセルをサポートするすべてのメソッドに CancellationToken を渡します。
  • CancelToken を定期的に確認します: このメソッドは定期的に確認する必要があります 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート