asp.net

asp.net 异步能进行任务取消吗

小樊
86
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
看了该问题的人还看了