In 异步/等待常见问题解答 http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/10293335.aspx,斯蒂芬·图布 说:
An 等待的是公开的任何类型GetAwaiter
返回有效的方法awaiter.
...
An awaiter is any从返回的类型等待的’s GetAwaiter
方法并符合特定模式。
所以为了成为一个awaiter,类型应该:
- 实施INotifyCompletion http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.inotifycompletion.aspx界面。
- 提供一个名为的布尔属性
IsCompleted
.
- 提供无参数
GetResult
返回的方法void
or TResult
.
(我无视ICriticalNotifyCompletion
目前。)
我知道我提到的页面有一个示例,显示编译器如何转换等待操作,但我仍然很难理解。
When I await an 等待的,
- When is
IsCompleted
检查了吗?我应该在哪里设置?
- When is
OnCompleted
called?
- 哪个线程调用
OnCompleted
?
- 我看到了两个直接调用延续参数的例子
OnCompleted
并使用Task.Run(continuation)
在不同的例子中,我应该选择哪个,为什么?
为什么你想要一个定制服务员?
可以看到编译器的解释await
here http://blogs.msdn.com/b/lucian/archive/2011/04/15/async-ctp-refresh-design-changes.aspx。本质上:
var temp = e.GetAwaiter();
if (!temp.IsCompleted)
{
SAVE_STATE()
temp.OnCompleted(&cont);
return;
cont:
RESTORE_STATE()
}
var i = temp.GetResult();
根据评论编辑: OnCompleted
应该将其参数安排为异步操作的延续。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)