溫馨提示×

asp.net 異步能進行任務取消嗎

小樊
109
2024-12-09 20:16:22
欄目: 編程語言

是的,ASP.NET 中的異步編程模型支持任務的取消。你可以使用 CancellationToken 類來實現任務取消。以下是一個簡單的示例:

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace AspNetAsyncCancelExample
{
    public class AsyncController : ApiController
    {
        private readonly HttpClient _httpClient;

        public AsyncController()
        {
            _httpClient = new HttpClient();
        }

        public async Task<IHttpActionResult> GetAsync(CancellationToken cancellationToken)
        {
            try
            {
                // 模擬一個耗時任務
                await Task.Delay(5000, cancellationToken);

                // 如果任務被取消,將拋出 OperationCanceledException
                return Ok("任務完成");
            }
            catch (OperationCanceledException)
            {
                // 如果任務被取消,返回一個已取消的結果
                return StatusCode(499, "任務已取消");
            }
        }
    }
}

在這個示例中,我們創建了一個名為 AsyncController 的 ASP.NET 控制器,其中包含一個名為 GetAsync 的異步方法。這個方法接受一個 CancellationToken 參數,用于在客戶端請求時傳遞取消請求。

當客戶端發起一個帶有取消請求的 GET 請求時,CancellationToken 將被觸發,Task.Delay 方法將拋出一個 OperationCanceledException 異常。我們捕獲這個異常并返回一個已取消的結果(HTTP 狀態代碼為 499)。

要在客戶端發起一個帶有取消請求的 GET 請求,你可以使用以下代碼:

using System;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace AspNetAsyncCancelExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            using (HttpClient httpClient = new HttpClient())
            {
                CancellationTokenSource cts = new CancellationTokenSource();
                CancellationToken token = cts.Token;

                // 在 3 秒后取消任務
                cts.CancelAfter(3000);

                try
                {
                    HttpResponseMessage response = await httpClient.GetAsync("api/async", token);
                    response.EnsureSuccessStatusCode();
                    string responseBody = await response.Content.ReadAsStringAsync();
                    Console.WriteLine(responseBody);
                }
                catch (OperationCanceledException)
                {
                    Console.WriteLine("任務已取消");
                }
            }
        }
    }
}

在這個示例中,我們創建了一個 CancellationTokenSource 對象,并在 3 秒后調用 Cancel 方法來取消任務。我們還捕獲了 OperationCanceledException 異常,并在控制臺輸出 “任務已取消”。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女