我对C# 4.5 中的 new async
/await
关键字和类的可定制性有疑问。Task
首先了解我的问题的一些背景:我正在开发具有以下设计的框架:
- 一个线程有一个“当前要做的事情”列表(通常大约 100 到 200 个项目),这些列表作为自己的数据结构存储并作为列表保存。它有一个
Update()
函数可以枚举列表并查看是否需要执行某些“事物”并执行。基本上它就像一个大线程sheduler。为了简化事情,让我们假设“要做的事情”是true
在“完成”(并且不应该被称为下一次更新)以及false
调度程序应该在下一次更新时再次调用它们时返回布尔值的函数。 - 所有的“事物”都不能同时运行,也必须在这个线程中运行(因为线程静态变量)
- 还有其他线程可以做其他事情。
Update()
它们的结构是相同的:大循环在一个大函数中迭代数百件要做的事情。 - 线程可以相互发送消息,包括“远程过程调用”。对于这些远程调用,RPC 系统将某种未来对象返回到结果值。在另一个线程中,插入了一个新的“要做的事情”。
- 一个常见的“事情”就是链接在一起的 RPC 序列。目前,这种“链接”的语法非常冗长和复杂,因为您必须手动检查先前 RPC 的完成状态并调用下一个等。
一个例子:
Future f1, f2;
bool SomeThingToDo() // returns true when "finished"
{
if (f1 == null)
f1 = Remote1.CallF1();
else if (f1.IsComplete && f2 == null)
f2 = Remote2.CallF2();
else if (f2 != null && f2.IsComplete)
return true;
return false;
}
现在这一切听起来都很棒async
,await
C# 5.0 可以在这里帮助我。我还没有 100% 完全理解它在幕后做了什么(有什么好的参考资料吗?),但是当我从我看过的一些谈话中得到它时,它用这个非常简单的代码完全符合我的要求:
async Task SomeThingToDo() // returning task is completed when this is finished.
{
await Remote1.CallF1();
await Remote2.CallF2();
}
但是我找不到一种方法来编写我的Update()
函数来使这样的事情发生。async
并且await
似乎想使用Task
- 类又似乎需要真正的线程?
到目前为止我最接近的“解决方案”:
第一个线程(正在运行SomeThingToDo
)只调用一次它们的函数并存储返回的任务并测试每个Update()
任务是否完成。
Remote1.CallF1
返回一个带有空操作作为构造函数参数的新任务,并记住返回的任务。当 F1 实际完成时,它会调用RunSynchronously()
任务将其标记为已完成。
在我看来,这似乎是对任务系统的一种变态。此外,它会在两个线程之间创建共享内存(任务的IsComplete
布尔值),如果可能的话,我想用我们的远程消息传递系统替换它。
最后,它不能解决我的问题,因为它不适用于SomeThingToDo
上面的类似等待的实现。似乎异步函数返回的自动生成的任务对象立即完成?
所以最后我的问题:
- 我可以连接到 async/await 以使用我自己的实现而不是
Task<T>
? - 如果那不可能,我可以
Task
在没有任何与“阻塞”和“线程”相关的情况下使用吗? async
有什么好的参考,当我写和时到底发生了什么await
?