为什么没有等待的异步函数会导致编译器警告?

xdu*_*ine 2 async-await c#-5.0

任何人都可以解释为什么c#5中的异步函数需要至少有1个等待?我找不到明确的理由/解释.

根据需要,我的意思是编译器在async函数内部没有任何await调用时发出警告,但不会抛出编译错误.

这个答案:

同样,标记为async的方法必须至少有一个等待.在await上,运行时将保存当前线程的状态和调用堆栈,进行异步调用,并展开回运行时的消息循环以处理下一条消息并保持应用程序的响应.当异步操作完成时,在下一个调度机会时,用于启动异步操作的调用堆栈将被推回并继续,就像调用是同步的一样.

但是来自msdn:

如果该方法不包含await表达式或语句,则它将同步执行.编译器警告会提醒您任何不包含等待的异步方法,因为这种情况可能表示错误.

发生什么类型的错误,这是一个编译器警告而不仅仅是推荐的用法?

out*_*man 6

MSDN对此警告有一个很好的描述:编译器警告(级别1)CS4014.它的好引用将是:

在大多数情况下,这种行为并不是您所期望的.

我认为存在这种警告的主要原因是async/await并不是很明显,开发人员通常会犯错,就像我将在下面描述的那样.

例如,你有一个方法,它可以做几秒钟的重做:

public int DoSomething()
{
    int sum = 0;

    for (int i = 0; i < 10; i++)
    {
        sum += i;
        Thread.Sleep(1000);
    }

    return sum;
}
Run Code Online (Sandbox Code Playgroud)

你听说过asyncawait什么地方,你想尝试一下.这就是人们常常认为他们会将所有内容都移到后台(可能不常见,但我认为这是它在我阅读更多文档之前的工作原理,所以我们至少可以算一下):

public async Task<int> DoSomething()
{
    int sum = 0;

    for (int i = 0; i < 10; i++)
    {
        sum += i;
        Thread.Sleep(1000);
    }

    return sum;
}
Run Code Online (Sandbox Code Playgroud)

你认为问题已经解决了,但是警告告诉你,如果没有await你不应该使用async,因为它什么都不做,你的所有代码都会同步运行,最后一个示例与async下一个代码类似:

public Task<int> DoSomething()
{
    int sum = 0;

    for (int i = 0; i < 10; i++)
    {
        sum += i;
        Thread.Sleep(1000);
    }

    return Task.Result<int>(sum);
}
Run Code Online (Sandbox Code Playgroud)

在同一个上下文中执行所有操作的地方,它调用此方法.

所以这个警告的主要原因我想让人们知道可能他们使用了async错误,这是阅读文档的时候了.