如何让 Visual Studio Intellisense 推荐方法的异步变体

How to get Visual Studio Intellisense to recommend an Async variant of a method

作为库开发人员,我通常会在需要时创建 AsyncNon-Async 方法。然而,我发现,使用我的库的开发人员通常会在已经异步的方法中使用非异步方法。

如何让开发人员 visual studio(或者 resharper???)知道有一个异步版本,并且在这种情况下推荐使用它?我希望我可以在方法上添加一个属性。

示例:

public async Task DoSomething()
{
    var result = MyLibrary.Run(variable); // <- this should be var result = await MyLibrary.RunAsync(variable, cancelationToken);

    var businessLogicResult =  doBusinessLogicOnResult(result);

    await someHttpCallThatIsAsync(businessLogicResult);
}

您可以构建 Roslyn 分析器来提供您的库。

从这里开始:Get started with Roslyn analyzers

如果您想查看示例,这是一个很好的资源:Microsoft.CodeAnalysis.FxCopAnalyzers

代码分析器(又名 Roslyn 分析器)是必经之路。可以自己编写,特别是针对您希望人们使用您的图书馆的方式。您可以将它们添加为您的库的依赖项,这样只要有人使用您的库,它们就会自动包含在内。这会给你很大的灵活性,但需要做更多的工作,而不仅仅是向你的代码添加一个属性。

或者,您可以建议人们使用一组更通用的分析器(例如 Microsoft.VisualStudio.Threading.Analyzers has a "Call async methods when in an async method”,这听起来像您想要的)。您甚至可以直接依赖该分析器库,但是您必须考虑您的消费者对您的库的看法,这会导致他们在代码的其他不相关部分出现分析器错误。虽然在可能的情况下使用异步方法通常是个好主意,但在某些情况下您不这样做t want to. Entity Framework 在使用 ToListAsync() 时有一些严重的性能下降,例如,如果你正在读取像 nvarchar(max) 这样的大列值。