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

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

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, я получаю исключение «Никакой дескриптор данного имени не существует». Что я делаю неправильно?

Спасибо.


person user363061    schedule 11.06.2010    source источник
comment
оба процесса работают под одним и тем же пользователем? не то чтобы они должны были быть, просто любопытно.   -  person James Manning    schedule 11.06.2010
comment
Да, они оба работают как один и тот же пользователь.   -  person user363061    schedule 11.06.2010


Ответы (2)


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

person user363061    schedule 11.06.2010

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

person Mark Wilkins    schedule 11.06.2010
comment
Я просто попытался создать семафор в статическом конструкторе, который вызывается до запуска потока, и у меня все еще есть та же проблема. - person user363061; 11.06.2010
comment
Кроме того, метод / процесс, вызывающий DoStuff, на самом деле является сценарием Perl, вызывающим DoStuff через COM. - person user363061; 11.06.2010
comment
Создается ли он до вызова DoStuff? - person Mark Wilkins; 11.06.2010
comment
Да, он создается до запуска потока и до вызова DoStuff. - person user363061; 11.06.2010
comment
Этот процесс все еще существует, когда семафор открыт в другом процессе? Я считаю, что если исходный процесс создает его, а затем завершает работу до того, как его откроет другой, семафор будет уничтожен. - person Mark Wilkins; 11.06.2010
comment
Тогда я не уверен. Похоже, должна быть какая-то проблема с правами доступа. - person Mark Wilkins; 11.06.2010
comment
Если бы это была проблема с правами доступа, я бы получил исключение UnauthorizedAccessException. Я могу получить доступ к семафору в процессе, который его создает, но не в другом процессе. Если поток, создавший семафор, спит, будет ли он недоступен? - person user363061; 11.06.2010