【问题标题】:How to configure resharper to warn about async methods that return void如何配置 resharper 以警告返回 void 的异步方法
【发布时间】:2014-09-04 16:52:16
【问题描述】:

我遇到了一些尴尬的间歇性错误,其中异步方法返回 void 而不是 Task,因此没有被等待。为了避免将来出现此类问题,我正在尝试创建一个自定义的 resharper 模式来突出显示警告等方法。

我创建了如下模式:

async void $methodname$($arguments$)
{
$statements$
}

(其中参数和语句允许无限数量的每个和方法匹配是包含 1 个或多个合法标识符字符的标识符)

奇怪的是,这突出了所有 void 方法,而不仅仅是异步 void 方法。谁能看到我的错误?由于尝试匹配似乎是一种常见模式,而 google 没有报告它,我怀疑这是否是 Reshaper 8.2.1 中的一个突出问题。

附:我知道我的模式与泛型方法不匹配——如果我能让它适用于非泛型方法,我稍后会修复它)

更新

正如 cmets 中强调的那样,我意识到该规则无法处理许多误报和误报。我关心的是如何让异步匹配在 resharper 中工作——一旦工作,我可以让规则更精确。

【问题讨论】:

  • 如果$methodname$ 需要await 一个方法调用怎么办?
  • 如果我的问题模棱两可,我很抱歉,这些方法引起的错误是间歇性的,因为我想要找到的方法确实是异步的,需要等待。解决方法是让方法返回 Task ,从而鼓励/警告调用者等待他们的完成。几乎所有异步方法都应该返回 Task 或 Task.
  • 这将无法解释真正应该是 async void 的顶级事件处理程序。它也不会解决异步lambadas,根据我的经验,这是最可能导致无意async void方法的原因。
  • 确实,但由于异步事件处理程序很少见,至少在我们的代码库中,这就是模式必须处理的全部内容:它应该轻松突出一些危险情况并强制执行命名约定和/或参数可能会排除大部分其余部分。这里的问题是如何编写与 async 关键字匹配的模式,而不是如何区分某些类型的调用。我同意你关于异步 lambdas 的看法,但是今天大部分时间都浪费在一个完整的异步方法上,这仍然很有用。
  • Resharper youtrack.jetbrains.com/issue/RSRP-329660 上有一个开放的功能请求请使用主块右下角的竖起大拇指图标对此请求进行投票。离开 cmets 也可能有助于加快这一进程,因为它已经存在 2 年多了。

标签: c# resharper async-await


【解决方案1】:

我们在我们的项目中使用免费的ReCommended Extension for ReSharper 进行“异步无效”分析。该扩展突出了 async void 的不当使用,并提供了明显的快速修复。

分析规则描述如下:ReCommended-Extension wiki

【讨论】:

    【解决方案2】:

    你真的不能那样做。 Resharper 的自定义模式的工作方式显然还不理解 async 关键字(这就是它突出显示所有返回 void 的方法,而不仅仅是 async 的原因)。您还可以看到this example,它匹配async 和非async 方法。

    可以做的是尝试通过搜索以“Async”结尾的方法名称来查找async 方法,如下所示:

    async void $method$($parameters$)
    {
        $statements$
    }
    

    方法标识符由这个正则表达式定义:\b\w+(Async)\b

    这将允许您替换它:

    void RunAsync() // or async void RunAsync()
    {
        ...
    }
    

    有了这个:

    async Task RunAsync()
    {
        ...
    }
    

    【讨论】:

    • 谢谢,这很有帮助,证实了我的怀疑。我将添加基于名称的模式,看看效果如何。
    猜你喜欢
    • 2015-12-22
    • 2016-08-30
    • 2012-08-08
    • 2018-03-03
    • 1970-01-01
    • 2014-01-03
    • 2019-03-28
    • 2015-11-30
    • 2016-06-12
    相关资源
    最近更新 更多