在单线程API中处理在事件处理程序中休眠的最佳方法?

时间:2010-03-10 00:15:25

标签: c# .net asynchronous fibers

我正在使用非线程安全事件API。调用wait(),并从该调用调度事件处理程序。我希望能够在事件处理程序中“休眠”一段时间。目前,我有一个调度程序,它安排稍后调用的函数,并且有一些hack让我使用Scheduler.Sleeper(some_ienumerator)作为事件处理程序,所以我可以将timespans作为一种睡眠。有没有更好的解决方案?如果C#具有Ruby风格的Fibers,我将能够使调度程序具有我可以调用的Sleep()函数,并且睡眠内容可以在事件处理程序调用的函数中,而不是直接处理程序。鉴于缺乏易于使用的纤维,我还能做些什么吗?

编辑澄清:我调用wait(n),其中n是一段时间,在等待调用期间,API调用事件处理程序。我想在其中一些处理程序中“睡觉”的原因是因为这是针对某个游戏,在点击某些内容后,某个对象可能会闪烁一秒钟。

1 个答案:

答案 0 :(得分:0)

你的问题不是很清楚。问题是你在“等待”时想做什么?如果您正在讨论关于WinForms GUI应用程序的示例,那么您可能希望在等待时处理其他事件(可以使用Application.DoEvents方法完成),那么您是否可以使用类似的解决方案?

可以使用迭代器(yield return)关键字在C#中模拟轻量级协作多线程(可能类似于Ruby光纤)。在.NET中执行此类操作的更好方法是使用F#,您可以使用异步工作流更优雅地执行此类操作。这篇文章演示了编写单线程GUI,您可以在其中“等待”事件发生而不会阻塞:

正如我所说,你可以使用yield return在C#中模拟这个。这是我的尝试:

另一种基于yield return的方法是Concurrency and coordination runtime,它有点复杂,但主要是为C#设计的。