是的,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 TaskGetAsync(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
异常,并在控制台输出 “任务已取消”。