Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CA2007:不直接等待任务

CA2007:不直接等待任务

作者头像
呆呆
发布于 2022-02-26 00:52:38
发布于 2022-02-26 00:52:38
1.5K0
举报
文章被收录于专栏:centosDaicentosDai

规则 ID

CA2007

类别

可靠性

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

非中断

原因

异步方法会直接等待 Task。

规则说明

异步方法直接等待 Task 时,延续任务通常会出现在创建任务的同一线程中,具体取决于异步上下文。 此行为可能会降低性能,并且可能会导致 UI 线程发生死锁。 请考虑调用 Task.ConfigureAwait(Boolean) 以表示延续任务意图。

如何解决冲突

若要解决冲突,请在等待的 Task 上调用 ConfigureAwait。 可以为 continueOnCapturedContext 参数传递 true 或 false。

对任务调用 ConfigureAwait(true) 与未显式调用 ConfigureAwait 的行为相同。 通过显式调用此方法,可让读取者知道你是有意要对原始同步上下文执行延续任务。

对任务调用 ConfigureAwait(false) 可将延续任务安排到线程池,从而避免 UI 线程上出现死锁。 对于与应用无关的库,传递 false 是一个好的选择。

示例

下面的代码片段会生成此警告:

public async Task Execute()

{

Task task = null;

await task;

}

若要解决此冲突,请在等待的 Task 上调用 ConfigureAwait:

public async Task Execute()

{

Task task = null;

await task.ConfigureAwait(false);

}

何时禁止显示警告

此警告适用于库,在库中,可能会在任意环境中执行代码,而代码不应对环境或方法的调用方如何调用或等待作出假设。 一般来说,对于代表应用程序代码(而不是库代码)的项目,可完全禁止显示此警告;事实上,在应用程序代码上运行该分析器(例如 WinForms 或 WPF 项目中的按钮单击事件处理程序)很可能会导致执行错误的操作。

如果应将延续任务安排回原始上下文,或者还没有此类上下文,都可禁止显示此警告。 例如,在 WinForms 或 WPF 应用程序中的按钮单击事件处理程序中编写代码时,通常情况下,等待的延续任务应在 UI 线程上运行,因而需要将延续任务安排回原始上下文的默认行为。 另举一例,在 ASP.NET Core 应用程序中编写代码时,默认情况下没有 SynchronizationContext 或 TaskScheduler,原因是 ConfigureAwait 不会实际更改任何行为。

抑制警告

可以通过多种方式来禁止显示代码分析警告,包括禁用项目的规则、使用预处理器指令为特定代码行禁用该规则或应用 SuppressMessageAttribute 特性。 有关详细信息,请参阅如何禁止显示代码分析警告。

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

排除 async void 方法

输出类型

可以仅为此规则、为所有规则或为此类别(可靠性)中的所有规则配置所有这些选项。 有关详细信息,请参阅代码质量规则配置选项。

排除 async void 方法

可配置是否要排除不从此规则返回值的异步方法。 要排除这些类型的方法,需将以下键值对添加到项目中的 .editorconfig 文件:

# Package version 2.9.0 and later

dotnet_code_quality.CA2007.exclude_async_void_methods = true

# Package version 2.6.3 and earlier

dotnet_code_quality.CA2007.skip_async_void_methods = true

输出类型

还可以配置此规则要应用的输出程序集种类。 例如,如果仅将此规则应用于生成控制台应用程序或动态链接库的代码(即不是 UI 应用),需将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CA2007.output_kind = ConsoleApplication, DynamicallyLinkedLibrary

另请参阅

ConfigureAwait 常见问题解答

是否应使用 ConfigureAwait (false) 来等待任务?

CA2008:不要在未传递 TaskScheduler 的情况下创建任务

可靠性规则

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
CA2008:不要在未传递 TaskScheduler 的情况下创建任务
以下 .NET 任务创建和延续方法具有允许指定或省略 TaskScheduler 实例的重载:
呆呆
2022/02/26
5320
使用 .NET 8/9 中的 Async/Await 避免常见错误并提高性能
在.NET 8中,异步编程对于构建响应迅速且高效的应用程序至关重要。如果使用得当,async/await关键字能够简化异步代码的复杂性,但它也并非毫无挑战。在本文中,我们将探讨开发人员常犯的错误以及避免这些错误的实用策略,所有内容都将基于实际的编码场景展开。
郑子铭
2025/01/08
3220
使用 .NET 8/9 中的 Async/Await 避免常见错误并提高性能
ConfigureAwait in .NET 8
ConfigureAwait(true) 和 ConfigureAwait(false
郑子铭
2023/12/13
3600
ConfigureAwait in .NET 8
CA3004:查看信息泄露漏洞的代码
泄漏异常信息可让攻击者深入了解应用程序的内部机制,从而帮助攻击者找到其他漏洞并利用这些漏洞。
呆呆
2022/02/20
6730
C# async/await 使用总结
今天搞这两个关键字搞得有点晕,主要还是没有彻底理解其中的原理。 混淆了一个调用异步方法的概念: 在调用异步方法时,虽然方法返回一个 Task,但是其中的代码已经开始执行。该方法在调用时,即刻执行了一部分代码,直接最底层的 Async API 处才产生真正的异步操作,这时向上逐步返回,并最终使用一个 Task 来代表该异步任务。 当不使用 await 关键字时,该异步方法同样在异步执行。而使用 await 关键字后,只不过是对 Task(awaitable) 对象异步等待其执行结束,然后再同上下文中执行后续代
用户1172223
2018/01/26
1.1K0
CA3002:查看 XSS 漏洞的代码
在处理来自 Web 请求的不受信任的输入时,请注意防范跨站脚本 (XSS) 攻击。 XSS 攻击会将不受信任的输入注入原始 HTML 输出,使攻击者可以执行恶意脚本或恶意修改网页中的内容。 一个典型的技术是将包含恶意代码的 <script> 元素放入输入中。 有关详细信息,请参阅 OWASP 的 XSS。
呆呆
2022/02/20
6970
CA1030:在适用处使用事件
该规则检测名称通常用于事件的方法。 事件遵循“观察者”或“发布-订阅”设计模式;当必须将一个对象的状态更改传达给其他对象时,它们适用。 如果为响应明确定义的状态更改而调用一个方法,则应由事件处理程序调用该方法。 调用该方法的对象应引发事件而不是直接调用该方法。
用户4268038
2022/01/10
4510
Async,Await和ConfigureAwait的关系
在.NET Framework 4.5中,async / await关键字已添加到该版本中,简化多线程操作,以使异步编程更易于使用。为了最大化利用资源而不挂起UI,你应该尽可能地尝试使用异步编程。虽然async / await让异步编程更简单,但是有一些你可能不知道的细节和注意的地方
leon公众号精选
2022/04/27
7590
Async,Await和ConfigureAwait的关系
[C#.NET 拾遗补漏]16:几个常见的TAP异步操作
在本系列上一篇文章 [15:异步编程基础] 中,我们讲到,现代应用程序广泛使用的是基于任务的异步编程模式(TAP),历史的 EAP 和 AMP 模式已经过时不推荐使用。今天继续总结一下 TAP 的异步操作,比如取消任务、报告进度、Task.Yield()、ConfigureAwait() 和并行操作等。
JusterZhu
2022/12/07
8400
CA1711:标识符应采用正确的后缀
按照约定,只有扩展某些基类型或实现某些接口的类型的名称或者从这些类型派生的类型的名称,应以特定的保留后缀结尾。 其他类型名称不应使用这些保留的后缀。
呆呆
2022/02/18
3520
CA3001:查看 SQL 注入漏洞的代码
使用不受信任的输入和 SQL 命令时,请注意防范 SQL 注入攻击。 SQL 注入攻击可以执行恶意的 SQL 命令,从而降低应用程序的安全性和完整性。 典型的技术包括使用单引号或撇号分隔文本字符串,在注释中使用两个短划线,以及在语句末尾使用分号。 有关详细信息,请参阅 SQL Injection。
呆呆
2022/02/20
7090
.NET Core多线程 (3) 异步 - 下
方法一:不使用同步上下文(比如WindowsFormSynchronizationContext)
Edison Zhou
2023/08/11
2740
.NET Core多线程 (3) 异步 - 下
CA1046:不要对引用类型重载相等运算符
对于引用类型,相等运算符的默认实现几乎始终是正确的。 默认情况下,仅当两个引用指向同一对象时,它们才相等。
呆呆
2022/01/10
3180
CA3007:查看公开重定向漏洞的代码
处理不受信任的输入时,请注意防范开放重定向漏洞。 攻击者可以利用开放重定向漏洞,使用你的网站提供合法 URL 的外观,但将毫不知情的访客重定向到钓鱼网页或其他恶意网页。
呆呆
2022/02/20
9070
浅谈Await
   我们都知道Await关键字是.Net FrameWork4.5引入的特性。await使得我们使用异步更加时特别便捷,并且还不会导致线程堵塞。我们在使用时也就莫名其妙的使用。往往不知道为什么不会导致线程堵塞。在这里,简单的谈论下await的一点原理。
莫问今朝
2018/08/31
1.2K0
浅谈Await
CA1068:CancellationToken 参数必须最后出现
执行长时间运行操作或异步操作并可取消的方法,通常采用取消令牌参数。 每个取消令牌都有一个 CancellationTokenSource,以创建令牌并将其用于可取消的计算。 通常的做法是使用一长的方法调用链,将取消令牌从调用方传递到被调用方。 因此,参与可取消计算的大量方法最终都具有取消令牌参数。 但是,取消令牌本身通常与大多数这些方法的核心功能无关。 将此类参数作为列表中的最后一个参数是一种很好的 API 设计实践。
用户4268038
2022/01/11
6710
CA3003:查看文件路径注入漏洞的代码
在处理来自 Web 请求的不受信任的输入时,请谨慎使用用户控制的输入指定文件路径。 攻击者可能能够读取非预期文件,从而导致敏感数据出现信息泄漏。 或者,攻击者可能能够写入非预期文件,从而导致在未经授权的情况下修改敏感数据,或者降低服务器的安全性。 常见的攻击者技术是使用路径遍历访问预期目录之外的文件。
呆呆
2022/02/20
1.1K0
CA1051:不要声明可见实例字段
字段的主要用途应是作为实现的详细信息。 字段应为 private 或 internal,并应通过使用属性公开这些字段。 在访问某个字段时,可轻松访问属性,而属性访问器中的代码可在扩展类型功能时更改,而不会引入重大更改。
呆呆
2022/01/10
4920
CA2311:在未先设置 NetDataContractSerializer.Binder 的情况下,请不要反序列化
在未设置 Binder 属性的情况下调用或引用了 System.Runtime.Serialization.NetDataContractSerializer 反序列化方法。
用户4268038
2022/02/20
1.4K0
CA1000:不要在泛型类型中声明静态成员
泛型类型包含 static(在 Visual Basic 中为 Shared)成员。
呆呆
2022/01/09
5260
推荐阅读
相关推荐
CA2008:不要在未传递 TaskScheduler 的情况下创建任务
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档