2009-05-17 2 views
3

j'ai un événement mondial créé et mis/remis à zéro dans un processus C++ natif qui sont créés comme ceci:Watching Global Events créé par un processus natif dans un processus .NET

HANDLE hGlobalEvent = CreateEvent(NULL, TRUE, FALSE, _T("Global\\MyEvent")); 

Est-il possible (même si c'est avec une bibliothèque non écrite par MS) pour enregistrer un de ces événements dans un processus .NET (C#) afin que les gestionnaires d'événements standard .NET soient déclenchés lorsque l'événement global a changé?
Et je ne veux pas vraiment attendre l'événement et la boucle, comme c'est le cas en C++ avec WaitForSingleObject ... Je voudrais vraiment que ce soit un gestionnaire d'événements complètement asynchrone.

Je dois m'imaginer qu'il existe un moyen facile de le faire ... mais je ne le trouve pas.

Répondre

6

ThreadPool.RegisterWaitForSingleObject peut être utilisé pour exécuter un rappel lorsque l'événement est signalé. Obtenir un WaitHandle pour l'objet événement nommé en utilisant le EventWaitHandle constructor qui prend un nom de chaîne.

bool createdNew; 
WaitHandle waitHandle = new EventWaitHandle(false, 
    EventResetMode.ManualReset, @"Global\MyEvent", out createdNew); 
// createdNew should be 'false' because event already exists 
ThreadPool.RegisterWaitForSingleObject(waitHandle, MyCallback, null, 
    -1, true); 

void MyCallback(object state, bool timedOut) { /* ... */ } 
+0

EventWaitHandle ouvrira l'événement créé dans le processus Win32, ne pas créer un nouvel événement, correct? –

+1

Oui, et il y a une surcharge du constructeur que vous pouvez appeler pour vérifier cela; il a un paramètre 'out' bool qui vous indique si l'événement existe déjà ou a été créé par le constructeur. Dans votre cas, la valeur de sortie doit être false. J'ai mis à jour l'extrait de code pour le montrer. –

+0

Génial ... merci pour la mise à jour. Cela a vraiment aidé. Et maintenant, peut-être une solution à cette question apparaîtra réellement sur google :) –