【问题标题】:Find awaitable methods in code with Visual Studio使用 Visual Studio 在代码中查找可等待的方法
【发布时间】:2015-07-07 18:24:23
【问题描述】:

我有一个问题,在代码中调用 async 方法时,前面没有 await。有没有办法找到所有没有await 的等待方法?

编辑 - 我特别关心调用多个异步方法(忽略返回值)但只有一个具有 await 的场景,这足以让 Visual Studio 不发出警告关于它。

【问题讨论】:

  • 没有找到答案,但这里提出了一个非常相似的问题:How can I list all Task- or Task<T>-returning method invokings that lack an await call in a solution?
  • 您可以尝试搜索public Task&lt;
  • 在一般情况下,不可能确定您是否有任何未等待的任务。您总能找到某种方法来欺骗您的分析工具,让您认为某个给定的任务并没有在等待,即使它在等待。
  • 不想成为那个人,但不必等待异步方法——它只允许在其中使用等待。您能否澄清一下您是在谈论其中没有等待的异步方法,返回应该等待的任务的方法,还是您的印象是每个标记为异步的方法都应该等待?
  • @moarboilerplate,我更新了我的问题。

标签: c# visual-studio visual-studio-2013 async-await


【解决方案1】:

如果您使用 ReSharper 并打开解决方案范围的分析,则返回未等待任务的方法将由于“未使用返回值”而使方法签名的 Task 部分变灰。这里需要注意的是,这只会找到解决方案中任何地方都没有等待的方法;在将一个或多个用法更新为等待(或使用/引用Task)后,警告将消失。

如果您正在寻找不包含等待调用的异步方法(这意味着它们不需要标记为异步),ReSharper 也会以类似的方式告诉您。

    class AClass
    {
        public async void Foo() //async grayed out
        {
            DoSomethingAsync();
            Console.WriteLine("Done");
        }

        public Task<bool> DoSomethingAsync() //Task<bool> grayed out
        {
            return Task.Run(() => true);
        }    
    }

请注意,如果您的代码如下所示,这将不起作用:

    class AClass
    {
        public async void Foo()
        {
            bool b = DoSomethingAsync().Result;
            Console.WriteLine("Done");
        }

        public Task<bool> DoSomethingAsync()
        {
            return Task.Run(() => true);
        }    
    }

async 关键字(如果存在)仍会被标记,这意味着您可能很快就可以确定没有等待任务,但如果调用方法未标记为异步,那么您就不走运了。

【讨论】:

  • 我更新了我的问题。我担心调用了多个异步方法,但只有一个使用了await,但是您现在提出另一个问题,即调用方法何时缺少async 并且没有await 在任何一种情况下,听起来都是这样不是一个容易解决的问题。
  • 至少在第二种情况下,我可以编写一个正则表达式,查找方法调用后跟一个“.Result”,以获取大多数(如果不是全部)这些类型的调用。
  • 是的,为了完成您的要求,您必须依靠代码分析来查找所有返回任务的方法并跟踪每次调用的结果是如何使用的。这比将您描述的场景视为警告更可取,因为您希望在一个地方等待一个方法并在另一个地方同步调用它的情况是相当常见的。例如,如果你想在 main 中等待一个方法,你会遇到麻烦——你不能标记 main async。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-12
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
相关资源
最近更新 更多