gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 14:47:12 28 4
gpt4 key购买 nike

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com