Roslyn Analyzer 操作应如何处理异步代码?

How should Roslyn Analyzer actions handle async code?

我有一个 Roslyn 分析器,我最近将其更新为使用 CSharp.Workspaces 的 2.3 版。我发现在构建时会收到如下警告:

Analyzer attempted to register an 'async' action, which is not supported.

我添加的一些操作是异步的,因为它们从 Roslyn API 调用异步方法,如以下假设示例。

public override void Initialize(AnalysisContext context)
{
    context.RegisterSymbolAction(AnalyzeProperty, SymbolKind.Property);
}

private async void AnalyzeProperty(SymbolAnalysisContext context)
{
    var property = (IPropertySymbol) context.Symbol;
    foreach (var syntaxRef in property.DeclaringSyntaxReferences)
    {
        DoSomethingWith(await syntaxRef.GetSyntaxAsync());
    }
}

我是否应该将任务中 await 的任何用途更改为 .Result.Wait(),或者是否有其他方法可以更正我的代码以响应警告?

您不应该在同步上下文中使用 await。这将导致难以调试的时序问题。

使用 API 的同步版本。 http://sourceroslyn.io/#Microsoft.CodeAnalysis/Syntax/SyntaxReference.cs,29

顺便说一下,使用带有 Wait() 或 Result 的异步 API 可能不如在同步上下文中使用 await 那样糟糕,但它可能仍然很糟糕,因为这可能会导致线程饥饿,因为你正在阻塞当前线程只是为了等待另一个线程完成工作并且 return.

最好的方法是在同步上下文中使用同步 API。和异步上下文中的异步 API。