调用ThrowIfCancellationRequested前为何要先检查IsCancellationRequested
取消令牌冗余判断写法说明
你给出的这段代码中,外层的if (cancellationToken.IsCancellationRequested)判断完全是多余的,可以直接删除,仅保留cancellationToken.ThrowIfCancellationRequested()调用即可。
- 该方法的官方实现本身就包含了对
IsCancellationRequested属性的校验:只有当取消请求触发时,才会抛出OperationCanceledException,未触发时不会执行任何操作,和外层加的if判断逻辑完全重合。 - 这种写法通常是开发者对该方法的实现逻辑不熟悉,出于“先校验再操作”的固有习惯额外加的一层判断,没有任何功能收益,仅会产生可以忽略不计的重复属性读取开销,属于无意义的冗余代码。
- 只有一种场景需要主动写外层if判断:就是你提到的,需要在取消触发后、抛出异常前执行自定义清理操作,比如释放持有的资源、记录自定义取消日志、回滚已执行的操作等,这种场景下需要先判断状态执行清理,再调用抛异常方法,或者自行处理取消逻辑。
两种写法在无额外清理逻辑时完全等效:
// 冗余写法 if (cancellationToken.IsCancellationRequested) { cancellationToken.ThrowIfCancellationRequested(); } // 推荐简化写法 cancellationToken.ThrowIfCancellationRequested();
内容的提问来源于stack exchange,提问作者Jimmy Byström
相关产品推荐
相关产品推荐

