C# 使用Visual Studio在代码中查找可等待的方法

C# 使用Visual Studio在代码中查找可等待的方法,c#,visual-studio,visual-studio-2013,async-await,C#,Visual Studio,Visual Studio 2013,Async Await,我有一个问题,在代码中调用async方法时,前面没有wait。有没有办法找到所有没有await的等待方法 Edit-我特别关注调用多个异步方法(忽略返回值)的场景,但只有一个方法具有wait,这足以使Visual Studio不会对此发出警告。如果使用ReSharper并启用解决方案范围的分析,返回未被等待的任务的方法将由于“返回值未使用”而使方法签名的任务部分变灰。此处的警告是,这将只查找解决方案中任何位置未被等待的方法;更新一个或多个用法以等待(或使用/引用任务)后,警告将消失 如果您正在寻

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


Edit-我特别关注调用多个异步方法(忽略返回值)的场景,但只有一个方法具有
wait
,这足以使Visual Studio不会对此发出警告。

如果使用ReSharper并启用解决方案范围的分析,返回未被等待的任务的方法将由于“返回值未使用”而使方法签名的任务部分变灰。此处的警告是,这将只查找解决方案中任何位置未被等待的方法;更新一个或多个用法以等待(或使用/引用
任务
)后,警告将消失

如果您正在寻找不包含等待调用的异步方法(这意味着它们不需要标记为async),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);
        }    
    }
类AClass
{
public async void Foo()//异步变灰
{
DoSomethingAsync();
控制台。写入线(“完成”);
}
公共任务DoSomethingAsync()//任务灰显
{
返回任务。运行(()=>true);
}    
}
注意:如果您的代码如下所示,则此操作将不起作用:

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

        public Task<bool> DoSomethingAsync()
        {
            return Task.Run(() => true);
        }    
    }
类AClass
{
公共异步void Foo()
{
bool b=DoSomethingAsync()。结果;
控制台。写入线(“完成”);
}
公共任务DoSomethingAsync()
{
返回任务。运行(()=>true);
}    
}

async
关键字(如果存在)仍将被标记,这意味着您可能会很快发现任务未被等待,但如果调用方法未标记为async,则说明您运气不佳。

没有找到答案,但这里也提出了一个非常类似的问题:您可以尝试搜索
公共任务在一般情况下,不可能确定您是否有任何未等待的任务。你总是可以找到一些方法来欺骗你的分析工具,让它认为一个给定的任务并没有被等待,即使它是。不要试图成为那个家伙,但异步方法不需要等待——它只允许在它里面使用等待。您能否澄清一下,您所谈论的异步方法是否内部没有等待,返回应该等待的任务的方法,或者您是否认为每个标记为异步的方法都应该等待?@moarboilerplate,我更新了我的问题。我更新了我的问题。我曾担心调用多个异步方法,但只有一个方法使用了
await
,但现在您提出了另一个问题,即调用方法缺少
async
,并且在这两种情况下都没有
await
,听起来这不是一个容易解决的问题。至少在第二种情况下,我可以编写一个正则表达式,查找方法调用,后跟“.Result”,以获得大多数(如果不是全部)此类调用。是的,为了完成您的要求,您必须依靠代码分析来找到所有返回任务的方法,并跟踪每个调用的结果是如何使用的。这比将您描述的场景视为警告更可取,因为在一个地方等待一个方法并在另一个地方同步调用它的情况非常常见。例如,如果您想在main中等待一个方法,您会遇到麻烦——您不能将main标记为async。