CancellationToken 取消机制()-其他
CancellationToken 取消机制()
1、背景
在我们访问一个十分耗时的请求的时候(这里以web请求举例)
如果请求执行到一半的时候,用户把页面关掉了,那后台还在执行请求就会造成资源的浪费,所以需要引入取消请求机制
2、举例
代码很简单,直接居个小例子
[HttpGet("GetFile")]
public async Task<string> GetFile(string file)
{
CancellationTokenSource cts = new CancellationTokenSource();//通过CancellationTokenSource产生Token
cts.CancelAfter(3000);//超时时间3s
cts.Token.Register(() => Console.WriteLine($"超时取消"));//注册一个取消请求后的执行事件
return await DownFile(file, cts.Token);
}
private async Task<string> DownFile(string file, CancellationToken cancellationToken)
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine($"执行进度{i}");
if (cancellationToken.IsCancellationRequested)
{
return "超时";
}
await Task.Delay(1000);
}
return file + ":下载完成";
}
执行结果:请求在3s的时候取消掉了
3、那怎么监听页面情况呢?
在action注入CancellationToken(net core),框架会自己监听页面情况,如:
[HttpGet("GetFile2")]
public async Task<string> GetFile(string file, CancellationToken cancellationToke)
{
cancellationToke.Register(() => Console.WriteLine($"超时取消"));//注册一个取消请求后的执行事件
return await DownFile(file, cancellationToke);
}
关闭跳转Web/Postman取消等,都是断开了http请求建立的链接,断开后即触发CancellationToken
————————
1、背景
在我们访问一个十分耗时的请求的时候(这里以web请求举例)
如果请求执行到一半的时候,用户把页面关掉了,那后台还在执行请求就会造成资源的浪费,所以需要引入取消请求机制
2、举例
代码很简单,直接居个小例子
[HttpGet("GetFile")]
public async Task<string> GetFile(string file)
{
CancellationTokenSource cts = new CancellationTokenSource();//通过CancellationTokenSource产生Token
cts.CancelAfter(3000);//超时时间3s
cts.Token.Register(() => Console.WriteLine($"超时取消"));//注册一个取消请求后的执行事件
return await DownFile(file, cts.Token);
}
private async Task<string> DownFile(string file, CancellationToken cancellationToken)
{
for (int i = 1; i <= 10; i++)
{
Console.WriteLine($"执行进度{i}");
if (cancellationToken.IsCancellationRequested)
{
return "超时";
}
await Task.Delay(1000);
}
return file + ":下载完成";
}
执行结果:请求在3s的时候取消掉了
3、那怎么监听页面情况呢?
在action注入CancellationToken(net core),框架会自己监听页面情况,如:
[HttpGet("GetFile2")]
public async Task<string> GetFile(string file, CancellationToken cancellationToke)
{
cancellationToke.Register(() => Console.WriteLine($"超时取消"));//注册一个取消请求后的执行事件
return await DownFile(file, cancellationToke);
}
关闭跳转Web/Postman取消等,都是断开了http请求建立的链接,断开后即触发CancellationToken