首页 >后端开发 >C++ >如何正确取消WinRT中的异步任务?

如何正确取消WinRT中的异步任务?

Susan Sarandon
Susan Sarandon原创
2025-01-26 12:41:11222浏览

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方法,但任务仍在后台继续运行并完成。为了在取消时完全停止任务,请遵循以下准则:

  • 传递CancellationToken:CancellationToken传递给每个支持取消的方法。
  • 定期检查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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn