是的,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 異常,并在控制臺輸出 “任務已取消”。