Использование именованного системного семафора в качестве события для запуска чего-либо в другом процессе - PullRequest
1 голос
/ 11 июня 2010

У меня есть поток, который работает все время:

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

Я хочу иметь возможность выполнять вещи в блоке do, только когда что-то из другого процесса говорит об этом.Я пытаюсь использовать именованный системный семафор "sem_DoStuff", чтобы это произошло.

Код, который выполняется в моем другом процессе:

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

Итак, идея заключается в том, что когдаDoStuff вызывается, семафор освобождается, и DoSomeStuffThread прекращает ожидание, выполняет то, что находится в блоке do, а затем снова ждет DoStuff, прежде чем он будет вызван.Но когда вызывается DoStuff, я получаю исключение «Дескриптор с данным именем не существует».Что я делаю не так?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 11 июня 2010

Оказывается, проблема в том, что мне нужно было поставить Global \ перед именем семафора.

0 голосов
/ 11 июня 2010

Кажется, у вас неправильный порядок. Семафор sem_DoStuff должен существовать до создания потока (и, вполне возможно, до вызова функции DoStuff). Метод / процесс, который их вызывает, вероятно, должен быть тем, который создает семафор.

...