2017-09-25 44 views
2

我有一个Roslyn分析器,我最近更新使用CSharp.Workspaces的2.3版本。我发现,当我建立时,我得到如下警告:Roslyn 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()); 
    } 
} 

我应该改变await任何用来.Result.Wait()的任务,或者是有我应该纠正响应警告我的代码一些其他的方式?

回答

4

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

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

的方式,利用与等待)异步API(或结果可能不是那么糟糕,因为在同步环境中使用的await,但它可能是仍然很糟糕,因为这可能导致线程饥饿,因为你是阻止当前线程只是等待另一个线程完成工作并返回。

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

+0

这是否意味着我还应该使用同步API编写分析器操作的任何帮助器方法,而不是只编写它们的异步调用.Result或Wait()结尾? –

+0

@RikkiGibson作为一个分析器,你正在一个线程池线程上运行,并且没有任何UI操作正在等待你,所以只需执行'GetAwaiter()。GetResult()'就可以了。没有必要编写帮助器方法。 –

相关问题