什么是MsgWaitForMultipleObjects的C#等价物?

i_a*_*orf 10 c# multithreading threadpool

我在报告模式下有一个带有ListView的Windows窗体.对于视图中的每个项目,我需要执行一个长时间运行的操作,其结果是一个数字.

我在本机win32中执行此操作的方法是为每个项创建一个工作线程(天真地;当然我不会创建无限数量的线程),然后在线程句柄数组上创建MsgWaitForMultipleObjects().当每个计算完成时,线程信号和主UI线程唤醒并更新.同时,我们抽取消息,以便UI线程保持响应.

任何人都可以提供一个如何在C#中工作的例子吗?我看过Monitor对象,它似乎不是我想要的 - 或者是否在阻塞时抽取消息?

谢谢.

编辑:似乎WaitHandler.WaitAny()可能实际上是在发送消息.请参阅cbrumme关于 CLR中消息抽取的论文.

gar*_*rik 2

我认为,长期运行的活动对象是您的情况的最佳选择。主线程调用(活动对象的)代理。Proxy 将调用方法转换为消息,并且该消息将进入队列。代理向调用者返回未来对象(它是对未来结果的引用)。调度程序将消息一一出列,并在其他线程(工作线程)中真正执行您的任务。当工作线程完成一项任务时,它会更新 future 对象的结果或调用回调方法(例如,更新您的 UI)。Dispather 可以有多个工作线程来同时执行多个任务。

您可以参阅这篇关于长时间运行的活动对象模式的文章(带有示例)。