购物网站开发问题,wordpress 搜索本站,网站怎样添加百度地图,软文的目的是什么在 .NET Core 中使用异步编程已经很普遍了#xff0c; 你在项目中随处可见 async 和 await#xff0c;它简化了异步操作#xff0c;允许开发人员#xff0c;使用同步的方式编写异步代码#xff0c;你会发现在大部分的异步方法中#xff0c;都提供了CancellationToken参数… 在 .NET Core 中使用异步编程已经很普遍了 你在项目中随处可见 async 和 await它简化了异步操作允许开发人员使用同步的方式编写异步代码你会发现在大部分的异步方法中都提供了CancellationToken参数本文主要介绍下 CancellationTokenSource 和 CancellationToken在异步任务中的使用。手动取消任务创建一个 CancellationTokenSource然后调用异步方法时传入 CancellationToken它是一个轻量级对象可以通知请求是否已取消我们可以手动调用 cts.Cancel() 来取消任务为了方面演示这里我有用到局部方法。static async Task Main(string[] args)
{async Task Execute(CancellationToken token){await Task.Delay(3000, token);Console.WriteLine(Executed);} CancellationTokenSource cts new CancellationTokenSource(); _ Execute(cts.Token);// 手动取消任务cts.Cancel(); Console.ReadKey();
}
定时取消任务创建 CancellationTokenSource 的时候可以传入时间毫秒或者Timespan), 通过它我们可以在等待一段时间后自动取消任务。 CancellationTokenSource cts new CancellationTokenSource(1000); _ Execute(cts.Token); Console.ReadKey();
我们也可以调用 cts.CancelAfter(1000), 它会在1s后取消任务。cts.CancelAfter(1000);
CancellationToken 注册回调我们可以调用 Register()方法注册Token取消的回调参数需要传入 Action 委托。 CancellationTokenSource cts new CancellationTokenSource(1000);cts.Token.Register(() Console.WriteLine(任务已取消!));// 开始异步任务
_ Execute(cts.Token); Console.ReadKey();
Register() 注册回调后返回一个 CancellationTokenRegistration 对象同样的你可以在回调函数执行前移除注册回调就像这样cts.Token.Register(() Console.WriteLine(任务已取消!)).Unregister();
在 HttpClient 中使用同样你可以在 HttpClient 中使用传入 CancellationToken 或者使用HttpClient的Timeout属性超时后它会抛出一个 TaskCanceledException 的异常 CancellationTokenSource cts new CancellationTokenSource(10); _ await new HttpClient().GetAsync(https://www.youtube.com/,cts.Token); Console.ReadKey();
在 WebAPI中使用我创建了一个 WebAPI 项目其中的控制器代码如下等待了5s然后进行输出信息。 [HttpGet]
public async TaskIActionResult Index()
{await Task.Delay(5000);Console.WriteLine(Executed);return Ok();
}
启动项目后我们在浏览器页面上访问接口在第一次访问接口等待响应时我刷新一次了页面现在程序的输出信息如下说明前台页面刷新后后台并没有做取消操作执行了两次我们可以把程序改成这样传入 CancellationToken[HttpGet]
public async TaskIActionResult Index(CancellationToken token)
{await Task.Delay(5000,token);Console.WriteLine(Executed);return Ok();
}
现在在浏览器访问页面同样的第一次还未返回是我们刷新一次页面程序输出如下只有一次输出第一次请求抛出了一次 TaskCanceledException 异常没有继续执行后边的逻辑当然你可以捕获这个异常返回更友好的提示欢迎扫码关注我们的公众号 【全球技术精选】专注国外优秀博客的翻译和开源项目分享。