我需要编写一个 NDepend 规则来检查异步方法的每个等待是否都使用 ConfigureAwait(false)。
我检查一个方法是否使用 ConfigureAwait(Boolean)。如果那个方法不使用它,它就违反了规则。
from m in JustMyCode.Methods
where
!(m.IsUsingMethod("System.Threading.Tasks.Task.ConfigureAwait(Boolean)") ||
m.IsUsingMethod("System.Threading.Tasks.Task<TResult>.ConfigureAwait(Boolean)")) &&
m.IsAsync
select new {
m,
m.MethodsCalled
}
如果您确定每个异步方法都使用一个等待,则此代码可以正常工作。但是如果一个方法使用两个等待呢?那么您可以计算该方法中所有出现的等待。
例子
public async Task Foo()
{
await DoSomething();
}
public async Task Bar()
{
await DoSomething().ConfigureAwait(false);
}
public async Task Stone()
{
await DoSomething();
await DoSomething().ConfigureAwait(false);
}
Foo 和 Stone 违反了规则。
通过我的代码,我可以看到 Foo 违反了规则,但 Stone 没有违反它。
使用“MethodsCalled”,我可以检查一个方法是否使用了 ConfigureAwait(),这很好。但是我再次无法检查 await 和 ConfigureAwait() 'Stone' 的出现次数。