首頁 > 後端開發 > 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方法,但任務仍在後台繼續運行並完成。為了在取消時完全停止任務,請遵循以下準則:

  • 傳遞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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板