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

标签 c# async-await roslyn

我有一个 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/

相关文章:

c# - 无法创建新的 "Diagnostics with code fix"项目! (罗斯林+VS2013)

c# - CefSharp 浏览器视频无法播放

c# - 将按钮移动到 Div

c# - 如何将毫秒的日期时间转换为 C# 中的字符串?

asp.net - _Layout 中强类型局部 View 的异步操作

c# - 如何在不进行硬编码的情况下获取存储 .NET 引用程序集的目录路径?

c# - 检查用户控件是否在窗口范围内

javascript - Puppeteer 不关闭浏览器

c# - ActionFilterAttribute : When to use OnActionExecuting vs. OnActionExecutingAsync?

msbuild - SonarQube 具有基于 Roslyn 的自定义规则