У меня есть поток, который работает все время:
private void DoSomeStuffThread() {
Semaphore sem = new Semaphore(0, 3, "sem_DoStuff");
sem.WaitOne();
do {
//do some stuff
} while (sem.WaitOne());
}
Я хочу смочь только выполниться, материал в действительно блокируются, когда что-то от другого процесса говорит так. Я пытаюсь использовать "sem_DoStuff", названный системным семафором, чтобы позволить этому происходить.
Код, который выполнен в моем другом процессе:
public string DoStuff() {
try {
Semaphore sem = Semaphore.OpenExisting("sem_DoStuff");
sem.Release();
} catch (Exception e) {
return e.Message;
}
}
Так, идея состоит в том, что, когда DoStuff называют, семафор выпущен, и DoSomeStuffThread прекращает ожидать, выполняет то, что находится в, действительно блокируются, и затем ожидает DoStuff снова, прежде чем это станет названным. Но, когда DoStuff называют, я добираюсь, исключение 'Никакой дескриптор имени существует'.. Что я делаю неправильно?
Спасибо.
Оказывается, проблема заключалась в том, что мне нужно было поставить Global \ перед именем семафора.
Похоже, у вас неправильный порядок. Семафор sem_DoStuff
должен существовать до создания потока (и, вполне возможно, до вызова функции DoStuff
). Метод / процесс, который их вызывает, вероятно, должен быть тем, который создает семафор.