【发布时间】: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