Tengo un formulario de Windows con un ListView en modo de informe. Para cada elemento en la vista, necesito realizar una operación de larga ejecución, cuyo resultado es un número.¿Cuál es el equivalente de C# de MsgWaitForMultipleObjects?
La forma en que haría esto en win32 nativo es crear un hilo de trabajo para cada elemento (ingenuamente, por supuesto no crearé un número ilimitado de subprocesos) y luego MsgWaitForMultipleObjects() en la matriz de manejadores de subprocesos. A medida que finaliza cada cálculo, los hilos señalan y el subproceso principal de UI se activa y se actualiza. Mientras tanto, enviamos mensajes para que el hilo de la interfaz de usuario siga siendo receptivo.
¿Alguien puede dar un ejemplo de cómo esto podría funcionar en C#? Miré el objeto Monitor, y no parece ser lo que quiero, ¿o bombea mensajes mientras bloquea?
Gracias.
Editar: Parece que WaitHandler.WaitAny() podría realmente bombear mensajes. Consulte cbrumme's treatise sobre el bombeo de mensajes en el CLR.
Tiene razón, Monitor no bombea mensajes. WaitHandle puede ser un mejor lugar para buscar, pero no pude encontrar un método WaitHandle que también generara mensajes. – itowlson
Sí, también lo vi. Tampoco es un requisito que pueda esperar en múltiples objetos. Lo llevaré esperando un solo evento o algo ... Simplemente no quiero bloquear la interfaz de usuario. Todas las muestras que he encontrado hacen 'sleep (100)' o algo así para forzar un cambio de contexto, lo cual es muy triste. –
Supongo que el problema es que en WinForms el ciclo de mensajes no es explícito. Entonces no puedes hacer un MsgWaitX directamente, sino que necesitas algo que genere un evento. Por ejemplo, ejecute cada subtarea como un BackgroundWorker (y olvídese de las primitivas de sincronización). – itowlson