首頁 > 後端開發 > C++ > 在C#中取消時,如何正確停止任務?

在C#中取消時,如何正確停止任務?

DDD
發布: 2025-01-26 12:36:10
原創
675 人瀏覽過

How Can I Properly Stop a Task Upon Cancellation in C#?

在 C# 中有效處理任務取消

CancellationToken.CancelNotification 方法本身並不能停止正在運行的任務;它只是表示取消。 為了確保任務在取消時干淨地終止,您必須主動將取消處理合併到任務的邏輯中。

利用基於任務的異步模式 (TAP)

最有效的方法是持續使用 TAP 和 CancellationToken

  • 傳遞 CancellationToken:CancellationToken 參數合併到每個可以取消的方法中。
  • 定期取消檢查: 在這些方法中,使用 cancellationToken.ThrowIfCancellationRequested() 定期檢查令牌的狀態。 如果檢測到取消,則拋出異常以停止執行。

使用 TAP 修訂的代碼示例

這個改進的示例演示了正確的取消處理:

<code class="language-csharp">private async Task TryTask()
{
    using (var source = new CancellationTokenSource())
    {
        source.CancelAfter(TimeSpan.FromSeconds(1));
        try
        {
            Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);
            int result = await task; // Await will re-throw any exceptions.
            Console.WriteLine($"Task completed successfully: {result}");
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("Task cancelled successfully.");
        }
    }
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
    for (int i = 0; i < 1000000; i++)
    {
        cancellationToken.ThrowIfCancellationRequested(); // Check for cancellation
        // ... your long-running operation ...
    }
    return a + b;
}</code>
登入後複製

說明:

  • using 聲明: 即使發生異常,也確保 CancellationTokenSource 得到正確處置。
  • try-catch 塊: 處理 OperationCanceledException 拋出的 cancellationToken.ThrowIfCancellationRequested(),提供乾淨的取消處理。
  • slowFunc: cancellationToken.ThrowIfCancellationRequested() 調用策略性地放置在循環中,允許頻繁的取消檢查。 這可以防止請求取消後不必要的工作。

這種修改後的方法可保證任務在請求取消時立即停止,從而防止資源洩漏並提高整體應用程序響應能力。

以上是在C#中取消時,如何正確停止任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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