Come parallelizzare l’esecuzione del gestore di eventi in C #

Ho un dispositivo Kinect e sto sviluppando un programma con esso usando C #.

Per gestire il dispositivo, ho utilizzato AllFramesReady evento AllFramesReady per elaborare le informazioni su profondità e colore.

Ho creato un gestore di eventi per elaborare i dati che si chiama EventHandler1 . Sto facendo molte elaborazioni all’interno di questo gestore di eventi.

Mi piacerebbe fare un po ‘più di calcolo all’interno di un secondo gestore di eventi denominato EventHandler2 .

È ansible eseguire questi 2 gestori di eventi che sono fondamentalmente 2 funzioni in parallelo, su 2 thread differenti del processo principale? Se ansible, potresti darmi un codice di esempio per farlo?

    Questo è abbastanza facile da concludere in una class; tuttavia, è necessario aggregare tutti i gestori di eventi in un singolo gestore di eventi prima di sottoscrivere l’evento desiderato.

    Ecco una lezione veloce e sporca per dimostrarlo. Il primo evento fornito viene eseguito in linea con la chiamata dell’evento mentre tutti gli altri vengono eseguiti nel pool di thread predefinito.

     class ParallelEvent where TEventArg : EventArgs { private readonly EventHandler _handler1; private readonly EventHandler[] _moreHandlers; public ParallelEvent(EventHandler handler1, params EventHandler[] moreHandlers) { if (handler1 == null) throw new ArgumentNullException("handler1"); if (moreHandlers == null) throw new ArgumentNullException("moreHandlers"); _handler1 = handler1; _moreHandlers = moreHandlers; } public void Handler(Object sender, TEventArg args) { IAsyncResult[] asyncResults = new IAsyncResult[_moreHandlers.Length]; for (int i = 0; i < _moreHandlers.Length; i++) asyncResults[i] = _moreHandlers[i].BeginInvoke(sender, args, null, null); _handler1(sender, args); for (int i = 0; i < _moreHandlers.Length; i++) _moreHandlers[i].EndInvoke(asyncResults[i]); } } 

    Ora per usarlo costruiamo una class ParallelEvent che fornisce a tutti i gestori di eventi che vogliamo eseguire in parallelo. Quindi ci iscriviamo all'evento 'test' con il metodo Handler della class. Infine chiamiamo l'evento 'test' e controlliamo l'output. Considera il seguente esempio:

     private static event EventHandler test; static void Main() { var e = new ParallelEvent(Test1, Test2); test += e.Handler; test(null, EventArgs.Empty); } static void Test1(Object sender, EventArgs args) { Console.WriteLine("Start Test 1"); Thread.Sleep(100); Console.WriteLine("End Test 1"); } static void Test2(Object sender, EventArgs args) { Console.WriteLine("Start Test 2"); Thread.Sleep(100); Console.WriteLine("End Test 2"); } 

    Come previsto, il programma sopra riportato li esegue in parallelo come dimostrato dal seguente output:

     Start Test 1 Start Test 2 End Test 2 End Test 1 

    Infine, devi essere a conoscenza di altre preoccupazioni riguardanti il ​​codice multi-thread. Qualsiasi stato condiviso che viene modificato ora deve essere sincronizzato, ecc.

    Con un po 'di lavoro è ansible adattare la lezione di cui sopra per esporre un evento in modo che gli ascoltatori possano iscriversi e disiscriversi a proprio piacimento. Quindi, nel metodo Handler, si estrae l'elenco dei delegati tramite Delgate.GetInvocationList (). Una volta che hai un elenco di delegati, puoi elaborarli come il precedente metodo Handler esistente.