没有关键字怎么办?
我希望编译器在大多数时候意识到当我调用异步方法时,我想要它的结果。
Document doc = DownloadDocumentAsync();
而已。人们很难为此事想一个关键词的原因是因为这就像有一个关键词,“如果事情完全正常,就要做你想做的事情”。那应该是默认值,不需要关键字。
更新资料
我最初建议编译器应该聪明地进行类型推断以弄清楚该怎么做。进一步考虑一下,我会将现有的实现保留在CTP中,但对其进行了一些琐碎的添加,以减少需要await
显式使用关键字的情况。
我们发明了一个属性:[AutoAwait]
。这只能应用于方法。将其应用于您的方法的一种方法是对其进行标记async
。但是您也可以手动完成,例如:
[AutoAwait]
public Task<Document> DownloadDocumentAsync()
然后在任何async
方法中,编译器将假定您要等待对的调用DownloadDocumentAsync
,因此您无需指定它。对该方法的任何调用都会自动等待它。
Document doc = DownloadDocumentAsync();
现在,如果您想“变得聪明”并获得Task<Document>
,则可以使用运算符start
,该运算符只能出现在方法调用之前:
Task<Document> task = start DownloadDocumentAsync();
我想很整洁。现在,简单的方法调用意味着通常的含义:等待方法完成。并start
表示不同的内容:请勿等待。
对于出现在async
方法外部的代码,唯一允许您调用[AutoAwait]
方法的方法是在其前面加上start
。这迫使您编写具有相同含义的代码,而不管其是否出现在async
方法中。
然后我开始变得贪婪!:)
首先,我要async
应用于接口方法:
interface IThing
{
async int GetCount();
}
从根本上讲,这意味着实现方法必须返回Task<int>
或与兼容的东西await
,并且该方法的调用者将获得[AutoAwait]
行为。
另外,当我实现上述方法时,我希望能够编写:
async int GetCount()
因此,我不必提及Task<int>
返回类型。
另外,我想async
将其应用于委托类型(毕竟,它们类似于具有一种方法的接口)。所以:
public async delegate TResult AsyncFunc<TResult>();
一位async
代表-您猜对了- [AutoAwait]
举止。从一个async
方法中,您可以调用它,它将自动被await
编辑(除非您选择仅使用start
它)。因此,如果您说:
AsyncFunc<Document> getDoc = DownloadDocumentAsync;
那行得通。这不是方法调用。尚未启动任何任务-这async delegate
不是任务。这是一个做任务的工厂。你可以说:
Document doc = getDoc();
这将启动任务,等待任务完成并提供结果。或者你可以说:
Task<Document> t = start getDoc();
因此,这里“管道”泄漏的一个地方是,如果您想委托一个async
方法,则必须知道使用一种async delegate
类型。因此,Func
您不必说AsyncFunc
,等等。尽管有一天,这种事情可能会通过改进的类型推断来解决。
另一个问题是,如果您说从普通(非异步)方法开始应该怎么办。显然,编译错误是安全的选择。但是还有其他可能性。