2

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

4

0 回答 0