2013-04-11 58 views
2

任何人都可以解释为什么c#5中的异步函数需要至少有1个等待?我找不到明确的理由/解释。为什么没有等待的异步函数会导致编译器警告?

根据需要,我的意思是编译器会在异步函数内部没有任何等待调用时发出警告,但不会引发编译错误。

this answer

类似地,方法标记为异步必须至少有一个AWAIT。在等待时,运行时将保存当前线程的状态和调用堆栈,进行异步调用,并退回到运行时的消息循环以处理下一条消息并使应用程序响应。当异步操作完成时,在下一个调度机会中,启动异步操作的调用堆栈被推入并继续,就好像调用是同步的。

但是从MSDN:

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

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

+1

是不是[问 - 之前回答](http:// stackoverflow。com/questions/12016567/using-async-without-await)几次? – 2013-04-11 10:05:11

回答

6

MSDN对此警告有很好的描述:Compiler Warning (level 1) CS4014。从它的好报价将是:

在大多数情况下,这种行为是不是你所期望的。

我认为这个警告存在的主要原因是async/await并不是真的很明显,开发人员通常会犯下如下所述的错误。

比如你有一个方法,它做一些重几秒钟:

public int DoSomething() 
{ 
    int sum = 0; 

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

    return sum; 
} 

你听说过asyncawait的地方,你想尝试一下。这是人们经常认为他们(不经常也许,但我认为这是它是如何工作之前,我阅读更多的文档,所以我们可以指望至少我)移动的一切背景:

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

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

    return sum; 
} 

你认为这个问题是解决了,但警告,告诉你,没有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); 
} 

如果你在同一个环境中做所有事情,这就是所谓的m ethod。

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

相关问题