如何解决继续使用异步CTP
| 是否可以使用Async CTP来模拟连续性和尾部递归? 我正在考虑以下方面的想法:async Task Loop(int count)
{
if (count == 0)
retrun;
await ClearCallStack();
//is it possible to continue here with a clean call stack?
Loop(count -1)
}
我猜一个人需要一个自定义的调度程序,但是有可能吗?
(也就是说,它可以用于递归不浪费调用堆栈)
解决方法
是的,这完全有可能。
在最新的异步CTP(对于VS2010 SP1刷新)中,单元测试示例(在VB或C#中)有一个\“ GeneralThreadAffineContext \”类。这提供了仅以通用线程仿射方式运行异步方法所必需的帮助程序代码。
通过线程亲和力,我们的意思是异步延续在与原始线程相同的上下文中得到处理,类似于WinForms / WPF的行为,但是没有使真正的WPF或WinForms消息循环变得混乱。
Task.Yield()
的设计是将当前方法的其余部分推迟到SynchronizationContext,因此您甚至不需要编写自己的await ClearCallStack()
。相反,您的样本将归结为:
async Task DoLoop(int count)
{
// yield first if you want to ensure your entire body is in a continuation
// Final method will be off of Task,but you need to use TaskEx for the CTP
await TaskEx.Yield();
if (count == 0)
return;
//is it possible to continue here with a clean call stack?
DoLoop(count -1)
}
void Loop(int count)
{
// This is a stub helper to make DoLoop appear synchronous. Even though
// DoLoop is expressed recursively,no two frames of DoLoop will execute
// their bodies simultaneously
GeneralThreadAffineContext.Run(async () => { return DoLoop(count); });
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。