AnalysisContext.EnableConcurrentExecution() - 它到底有什么作用?

Mik*_*ain 5 c# roslyn roslyn-code-analysis

我已阅读此方法的文档,但细节相当少。

启用此分析器注册的分析器操作的并发执行。

到底并发执行了什么?假设我有:

public override void Initialize(AnalysisContext context)
{
    context.EnableConcurrentExecution();
    context.RegisterSyntaxNodeAction(AnalyzeNode, SyntaxKind.InvocationExpression);
}
Run Code Online (Sandbox Code Playgroud)

如果被分析的代码包含多个InvokingExpressions,每个表达式是否会在自己的线程上同时分析?

然而,这样的分析器必须确保其动作能够正确地并行执行。

什么构成“操作”?如何确保它“正确”执行?我的AnalyzeNode方法是static,从不可变状态读取,并且不写入任何共享状态。这够了吗?

启用并发执行有什么缺点吗?

或者我完全误解了这一点?

Kri*_*ten 4

如果被分析的代码包含多个InvokingExpressions,每个表达式是否会在自己的线程上同时分析?

确实,他们可能是。显然不能保证它们是,只有这么多线程。

什么是“行动”

“操作”是您使用诸如 之类的方法注册的委托RegisterSyntaxNodeAction

我的AnalyzeNode方法是static,从不可变状态读取,并且不写入任何共享状态。这够了吗?

是的。

启用并发执行有什么缺点吗?

如果您的操作是读取和写入共享状态,您要么必须同步这些访问,要么不启用并发执行。