我有一个 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 那样糟糕,但它可能仍然很糟糕,因为这可能会导致线程饥饿,因为您阻塞当前线程只是为了等待另一个线程完成工作并返回。
最好的方法是在同步上下文中使用同步 API。和异步上下文中的异步 API。
关于c# - Roslyn Analyzer 操作应如何处理异步代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46415494/