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