2010-03-10 45 views
2

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

编辑澄清:我打电话wait(n)其中n是一个时间量,并在该等待调用期间,API调用事件处理程序。我想在某些处理程序中“睡眠”的原因是因为这是针对游戏的,在点击某物之后,例如,物体可能会发光一秒钟。

+1

也许这只是我,但我很难确定你想要做什么。我尽我所能不要在我写的任何代码中睡一觉。我确定他们有时间和地点,但我被他们咬了太多次,通常他们是因为某个时间问题而被放置的。他们变成了创可贴而不是解决方案。话虽如此,我仍然不清楚你的意图是基于你的描述,所以我可能会错过 – 2010-03-10 00:59:49

回答

0

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

可以使用迭代器(yield return)关键字在C#中模拟轻量级协作多线程(可能类似于Ruby光纤)。在.NET中做这样的事情的更好方法是使用F#,在那里你可以使用异步工作流程更优雅地完成这种事情。下面是一个说明写单线程GUI在那里你可以“等待”事件发生无阻塞的文章:

就像我说的,你可以在C#中使用yield return模拟此。这里是我的尝试:

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

+0

这个问题的意图收益率回报的问题(至少是我使用它的方式,以及我对第二个链接的理解[第一个提到C#])是一个函数[A]不能简单地调用恰好使用yield return并且自身被停止的另一个函数[B],等待异步函数回调B并从那里获得A恢复。 – Sgeo 2010-03-10 04:13:11

+0

如果我理解正确,那正是文章中最后一个代码示例的作用。 'ReadToEndAsync'方法返回'IEnumerable '(并且包含'yield return')。在这篇文章中,我们可以使用'ExecuteAsync ()'将它变成一个代表异步计算_的值(类型为'Async '),然后你可以从外部方法调用这个计算(使用'yield return')。我认为,一般来说,您需要使用一些中间类型来表示_computations_。 – 2010-03-10 04:21:51

+0

在评论>。>之前,我没有完全阅读整篇文章。谢谢,那个链接(使用迭代器的C#中的异步编程)似乎是完美的! [但我仍然需要尝试]。 – Sgeo 2010-03-10 04:59:23

相关问题