Ho un Windows Form con ListView in modalità Report. Per ogni elemento nella vista, ho bisogno di eseguire un'operazione lunga, il cui risultato è un numero.Qual è l'equivalente C# di MsgWaitForMultipleObjects?
Il modo in cui vorrei farlo in Win32 nativo è creare un thread di lavoro per ciascun elemento (in modo ingenuo, ovviamente non creerò un numero illimitato di thread) e quindi MsgWaitForMultipleObjects() sulla matrice di handle di thread. Al termine di ogni calcolo, il segnale dei thread e il thread dell'interfaccia utente principale si sveglia e si aggiorna. Nel frattempo, pompiamo i messaggi in modo che il thread dell'interfaccia utente rimanga reattivo.
Qualcuno può fornire un esempio di come questo potrebbe funzionare in C#? Ho guardato l'oggetto Monitor, e non sembra essere quello che voglio, o pompa dei messaggi durante il blocco?
Grazie.
Modifica: Sembra che WaitHandler.WaitAny() potrebbe effettivamente pompare messaggi. Vedere cbrumme's treatise sul pompaggio dei messaggi nel CLR.
Hai ragione, Monitor non pompa messaggi. WaitHandle potrebbe essere un posto migliore dove guardare, ma non sono riuscito a trovare un metodo WaitHandle che pompasse anche i messaggi. – itowlson
Sì, l'ho visto anche io. Non è nemmeno un requisito che io possa aspettare su più oggetti. Prenderò in attesa di un singolo evento o qualcosa del genere ... semplicemente non voglio bloccare l'interfaccia utente. Tutti gli esempi che ho trovato fanno 'sleep (100)' o qualcosa per forzare un interruttore di contesto, che è molto triste. –
Immagino che il problema sia che in WinForms il ciclo del messaggio non è esplicito. Quindi non puoi fare direttamente un MsgWaitX, hai invece bisogno di qualcosa che aumenti un evento. Ad esempio, esegui ogni attività secondaria come BackgroundWorker (e dimentica le primitive di sincronizzazione). – itowlson