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

Rik*_*son 3 c# async-await roslyn

我有一个Roslyn分析器,我最近更新了使用CSharp.Workspaces的2.3版本.我发现当我构建时,我收到如下警告:

Analyzer尝试注册"异步"操作,但不支持此操作.

我添加的一些操作是异步的,因为它们从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());
    }
}
Run Code Online (Sandbox Code Playgroud)

我是不是应该改变任何使用await.Result.Wait()在工作,还是有我应该纠正响应警告我的代码一些其他的方式?

小智 5

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

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

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

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

  • @RikkiGibson 作为一个分析器,您正在线程池线程上运行,并且没有 UI 操作在等待您,因此只需执行“GetAwaiter().GetResult()”是安全的。无需编写辅助方法。 (2认同)