2010-06-11 1 views
1

J'ai un fil qui court tout le temps:L'utilisation d'un sémaphore système nommé comme un événement pour déclencher quelque chose dans un autre processus

private void DoSomeStuffThread() { 
Semaphore sem = new Semaphore(0, 3, "sem_DoStuff"); 
sem.WaitOne(); 
do { 
    //do some stuff 
} while (sem.WaitOne()); 
} 

Je veux être en mesure d'exécuter uniquement les choses dans le bloc faire quand quelque chose d'un autre processus le dit. J'essaie d'utiliser le sémaphore du système nommé "sem_DoStuff" pour permettre cela.

Le code qui est exécuté dans mon autre processus:

public string DoStuff() { 
try { 
    Semaphore sem = Semaphore.OpenExisting("sem_DoStuff"); 
    sem.Release(); 
} catch (Exception e) { 
    return e.Message; 
} 
} 

Ainsi, l'idée est que quand DoStuff est appelée, le sémaphores est libéré, et arrête DoSomeStuffThread attente, exécute ce qui est dans le bloc faire, puis attend de nouveau DoStuff avant qu'il ne soit appelé. Mais, quand DoStuff est appelé, je reçois l'exception 'Aucun descripteur du nom n'existe.'. Qu'est-ce que je fais mal?

Merci.

+0

Les deux processus s'exécutent-ils sous le même utilisateur? pas qu'ils doivent être, juste curieux. –

+0

Oui, ils s'exécutent tous deux sous le même utilisateur. – user363061

Répondre

2

Il s'est avéré que le problème était que j'avais besoin de mettre Global \ devant le nom du sémaphore.

0

Il semble que vous ayez mal commandé. Le sémaphore sem_DoStuff doit exister avant que le thread ne soit créé (et très probablement avant que la fonction DoStuff ne soit appelée). La méthode/processus qui les appelle devrait probablement être celui qui crée le sémaphore.

+0

J'ai juste essayé de créer le sémaphore dans un constructeur statique qui est appelé avant que le fil ne soit lancé, et j'ai toujours le même problème. – user363061

+0

En outre, la méthode/processus qui appelle DoStuff est en fait un script Perl qui appelle DoStuff via COM. – user363061

+0

Est-il créé avant l'appel de DoStuff? –

Questions connexes