我需要编写一个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'的出现次数。