我有一个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());
}
}
我是否应该在任务上将 await
的任何用途更改为 .Result
或 .Wait()
,还是有其他方式我应该更正我的代码以响应警告?
1 回答
你不应该在同步上下文中使用await . 这将导致难以调试的时序问题 .
使用API的同步版本 . http://source.roslyn.io/#Microsoft.CodeAnalysis/Syntax/SyntaxReference.cs,29
顺便说一句,使用带有Wait()或Result的异步API可能没有在同步上下文中使用await那么糟糕,但它可能仍然很糟糕,因为这可能会导致线程饥饿,因为你阻止当前线程只是为了等待另一个线程完成工作并返回 .
最好的方法是在同步上下文中使用同步API . 和异步上下文中的异步API .