前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CA2016:将 CancellationToken 参数转发到采用一个该参数的方法

CA2016:将 CancellationToken 参数转发到采用一个该参数的方法

作者头像
用户4268038
发布2022-02-20 19:37:22
4450
发布2022-02-20 19:37:22
举报
文章被收录于专栏:stcnbstcnb

类型名称

ForwardCancellationTokenToInvocations

规则 ID

CA2016

类别

可靠性

修复是中断修复还是非中断修复

非中断

原因

此规则查找可以接受 CancellationToken 参数但不传递任何参数的方法调用,并建议将父方法的 CancellationToken 转发给它们。

规则说明

此规则分析将 CancellationToken 作为其最后一个参数的方法定义,然后分析其主体中调用的所有方法。 如果任何方法调用可以接受 CancellationToken 作为最后一个参数,或者具有将 CancellationToken 作为最后一个参数的重载,此规则将建议改用该选项,以确保将取消通知传播到可以侦听它的所有操作。

备注

在 CancellationToken 类型可用的所有 .NET 版本中,规则 CA2016 都可用。 请参阅 CancellationToken“适用于”部分

如何解决冲突

可以手动修复,也可以选择让 Visual Studio 执行修复,方法是将鼠标悬停在方法调用旁显示的灯泡图标上,然后选择建议的更改。

下面的示例演示了两个建议的更改:

如果不关心是否将已取消的操作通知转发给下层方法调用,则可禁止显示此规则的冲突。 也可以在 C# 中显式传递 default(在 Visual Basic 中为 Nothing)或 None,以禁止显示规则冲突。

此规则可以检测各种冲突。 下面的示例演示了此规则可检测的情况:

示例 1

此规则建议将 c 参数从 MyMethod 转发到 MyMethodWithDefault 调用,因为该方法定义了一个可选的令牌参数:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithDefault(CancellationToken ct = default)

{

}

public static void MyMethod(CancellationToken c)

{

MyMethodWithDefault();

}

}

}

解决方法:

转发 c 参数:

public static void MyMethod(CancellationToken c)

{

MyMethodWithDefault(c);

}

如果不关心是否要将取消通知转发给下层调用,可以:

显式传递 default:

public static void MyMethod(CancellationToken c)

{

MyMethodWithDefault(default);

}

或显式传递 CancellationToken.None:

public static void MyMethod(CancellationToken c)

{

MyMethodWithDefault(CancellationToken.None);

}

示例 2

此规则建议将 c 参数从 MyMethod 转发到 MyMethodWithDefault 调用,因为该方法具有接受 CancellationToken 参数的重载:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithOverload()

{

}

public static void MyMethodWithOverload(CancellationToken ct = default)

{

}

public static void MyMethod(CancellationToken c)

{

MyMethodWithOverload();

}

}

}

解决方法:

转发 c 参数:

public static void MyMethod(CancellationToken c)

{

MyMethodWithOverload(c);

}

如果不关心是否要将取消通知转发给下层调用,可以:

显式传递 default:

public static void MyMethod(CancellationToken c)

{

MyMethodWithOverload(default);

}

或显式传递 CancellationToken.None:

public static void MyMethod(CancellationToken c)

{

MyMethodWithOverload(CancellationToken.None);

}

不冲突的示例

父方法中的 CancellationToken 参数不在最后位置:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithDefault(CancellationToken ct = default)

{

}

public static void MyMethod(CancellationToken c, int lastParameter)

{

MyMethodWithDefault();

}

}

}

默认方法中的 CancellationToken 参数不在最后位置:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithDefault(CancellationToken ct = default, int lastParameter = 0)

{

}

public static void MyMethod(CancellationToken c)

{

MyMethodWithDefault();

}

}

}

重载方法中的 CancellationToken 参数不在最后位置:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithOverload(int lastParameter)

{

}

public static void MyMethodWithOverload(CancellationToken ct, int lastParameter)

{

}

public static void MyMethod(CancellationToken c)

{

MyMethodWithOverload();

}

}

}

父方法定义了多个 CancellationToken 参数:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithDefault(CancellationToken ct = default)

{

}

public static void MyMethod(CancellationToken c1, CancellationToken c2)

{

MyMethodWithDefault();

}

}

}

具有默认值的方法定义了多个 CancellationToken 参数:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithDefault(CancellationToken c1 = default, CancellationToken c2 = default)

{

}

public static void MyMethod(CancellationToken c)

{

MyMethodWithDefault();

}

}

}

方法重载定义了多个 CancellationToken 参数:

using System.Threading;

namespace ConsoleApp

{

public static class MyTestClass

{

public static void MyMethodWithOverload(CancellationToken c1, CancellationToken c2)

{

}

public static void MyMethodWithOverload()

{

}

public static void MyMethod(CancellationToken c)

{

MyMethodWithOverload();

}

}

}

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档