我有一个Windows窗体与报表模式下的ListView。对于视图中的每个项目,我需要执行长时间运行的操作,其结果是一个数字。什么是MsgWaitForMultipleObjects的C#等价物?
我在原生win32中执行此操作的方式是为每个项目创建一个工作线程(当然,我不会创建无限数量的线程),然后在线程句柄数组上创建MsgWaitForMultipleObjects()。随着每个计算完成,线程信号和主UI线程唤醒并更新。与此同时,我们抽取消息以使UI线程保持响应。
任何人都可以提供一个如何在C#中工作的例子吗?我查看了Monitor对象,而且它看起来并不是我想要的 - 或者是在阻塞时抽取消息?
谢谢。
编辑:似乎WaitHandler.WaitAny()可能实际上泵送消息。请参阅cbrumme's treatise关于CLR中的信息抽取。
你说得对,Monitor不会收集消息。 WaitHandle可能是一个更好的地方,但是我找不到一个WaitHandle方法来提取消息。 – itowlson 2010-02-21 23:45:35
是的,我也看到了。这不是要求我能够等待多个对象。我会等待一个事件或其他事情......我只是不想阻止用户界面。我发现的所有样本都会“睡觉(100)”或其他东西来强制上下文切换,这非常令人伤心。 – 2010-02-21 23:47:26
我想问题是,在WinForms中,消息循环并不明确。所以你不能直接做一个MsgWaitX,你需要的东西会引发一个事件。例如,将每个子任务作为BackgroundWorker运行(并忘记同步基元)。 – itowlson 2010-02-22 00:13:49