网站做推广页需要什么软件下载,广州网站推广电话,网站制作需要什么软件,大连最新发布前言在群里看到有人问如何取消这个 Task 的执行#xff1a;实际上这并不会取消S1eepMode1方法的执行#xff1a;这是为什么呢#xff1f;原因首先#xff0c;让我们看看s_cts.Cancel()都做了啥#xff1a;public void Cancel() Cancel(false);public void Cancel(boo… 前言在群里看到有人问如何取消这个 Task 的执行实际上这并不会取消S1eepMode1方法的执行这是为什么呢原因首先让我们看看s_cts.Cancel()都做了啥public void Cancel() Cancel(false);public void Cancel(bool throwOnFirstException)
{ThrowIfDisposed();NotifyCancellation(throwOnFirstException);
}private void NotifyCancellation(bool throwOnFirstException)
{// If were the first to signal cancellation, do the main extra work.if (!IsCancellationRequested Interlocked.CompareExchange(ref _state, NotifyingState, NotCanceledState) NotCanceledState){...}
}实际上Cancel方法仅仅是将变量_state的值改为NotifyingState。那Task.Run传递s_cts.Token又有什么用呢public static TaskTResult RunTResult(FuncTaskTResult? function, CancellationToken cancellationToken)
{if (function null) ThrowHelper.ThrowArgumentNullException(ExceptionArgument.function);// Short-circuit if we are given a pre-canceled tokenif (cancellationToken.IsCancellationRequested)return Task.FromCanceledTResult(cancellationToken);...
}原来是在创建 Task 前先检查令牌是否已经Cancel以便快速终止。那么到底怎么才能Cacel已创建的Task呢实现其实Task.Run的方法实现已经告诉我们正确的解决方案那就是判断cancellationToken.IsCancellationRequested:public static async Task S1eepMode1(CancellationToken cancellationToken)
{while (true){if (cancellationToken.IsCancellationRequested)return;...}
}另外也可以采取抛出异常的方式public static async Task S1eepMode1(CancellationToken cancellationToken)
{while (true){cancellationToken.ThrowIfCancellationRequested();...}
}示例应用程序并不会捕获到这个异常相关问题可以看我以前的文章《如何保证执行异步方法时不会遗漏 await 关键字》结论在创建 Task 时请记住即使你执行了令牌取消操作也并不意味着 Task 会停止运行。添加微信号【MyIO666】邀你加入技术交流群