Jam*_*add 121 c# asynchronous return-type task-parallel-library async-ctp
在查看各种C#异步CTP示例时,我看到一些返回的异步函数void,以及其他返回非泛型函数的异步函数Task.我可以看到为什么返回a Task<MyType>对于在异步操作完成时将数据返回给调用者很有用,但是我看到的返回类型的函数Task永远不会返回任何数据.为什么不回来void?
Eri*_*ert 204
SLaks和Killercam的答案很好; 我以为我只是添加了一些上下文.
您的第一个问题主要是关于可以标记哪些方法async.
标记为
async可以返回的方法void,Task或Task<T>.它们之间有什么区别?
一个Task<T>返回异步方法可以等待,并在任务完成时,它会毫无顾忌了一个T.
一个Task返回异步方法可以等待,并在任务完成时,任务的延续计划运行.
甲void返回异步方法不能等待; 这是一种"火与死"的方法.它确实异步工作,你无法告诉它什么时候完成.这有点奇怪; 正如SLaks所说,通常你只会在制作异步事件处理程序时这样做.事件触发,处理程序执行; 没有人会"等待"事件处理程序返回的任务,因为事件处理程序不返回任务,即使他们这样做了,什么代码会使用Task来做什么?通常,用户代码不是首先将控制权转移给处理程序.
你的第二个问题,在评论中,主要是关于什么可以await编辑:
可以
await编写哪些方法?可以使用返回空隙的方法await吗?
不,无法等待返回空洞的方法.编译器转换await M()为调用M().GetAwaiter(),GetAwaiter可能是实例方法或扩展方法.等待的价值必须是你可以得到一个等待者的价值; 显然,返回空隙的方法不会产生一个可以获得等待的值.
Task - 退回方法可以产生可观的价值.我们预计第三方将希望创建自己的Task类似对象的实现,等待它们,您将能够等待它们.但是,您将不被允许声明async返回任何内容的方法void,Task或者Task<T>.
(更新:我的最后一句话可能会被未来的C#版本伪造;有一项建议允许异步方法的任务类型以外的返回类型.)
(更新:上面提到的功能进入了C#7.)
SLa*_*aks 22
如果调用者想要等待任务或添加延续.
事实上,返回的唯一原因void是如果你因为正在编写事件处理程序而无法返回Task.
Moo*_*ght 12
Type Task<T>是任务并行库(TPL)的主力类型,它代表了" T将来会产生类型结果的一些工作/工作"的概念."通用将在未来完成但不返回结果"的概念由非通用任务类型表示.
确切地说,将如何产生类型的结果T是特定任务的实现细节; 可能会将工作转移到本地计算机上的另一个进程,另一个线程等.TPL任务通常从当前进程中的线程池中移植到工作线程,但该实现细节不是该Task<T>类型的基础; 而a Task<T>可以表示产生a的任何高延迟操作T.
根据您的上述评论:
的await表达的意思是"评估这个表达式,以获得表示将在未来产生结果的工作的对象.注册的当前方法为背面与该任务的延续相关联的呼叫的剩余部分.一旦任务被产生并回呼已注册,立即将控制权交还给我的来电者".这与常规方法调用相反/相反,这意味着"记住你正在做的事情,运行这个方法,直到它完全完成,然后从你离开的地方开始,现在知道方法的结果".
编辑:我应该引用Eric Lippert在2011年10月的MSDN杂志上的文章,因为这对我理解这些东西起了很大帮助.
对于负载更多的信息和白页看到这里.
我希望这有一些帮助.