именованный системный мьютекс не распознан

Я пытаюсь использовать именованный системный мьютекс для синхронизации двух процессов:

  1. служба Windows С#
  2. настольное приложение С#

Когда мьютекс создается, процесс, который не создавал мьютекс, похоже, не обнаруживает существующий мьютекс. Ниже более подробно:

Служба Windows отвечает за создание мьютекса (без префиксов — глобальный/локальный и т. д. Просто обычный именованный системный мьютекс) следующим образом:

        Mutex myMutex= null;
        try
        {
            myMutex= Mutex.OpenExisting(myMutexName);

        }
        catch (WaitHandleCannotBeOpenedException x)
        {
            //doesn't exist. 
            try
            {
                this.GetLogger().Info("Create Mutex");
                bool createdNew = false;
                new Mutex(false, myMutexName, out createdNew);
                if (!createdNew) throw new Exception("Unable to create Mutex");

            }
            catch (Exception ex)
            {
                this.Stop();
            }

        }
        catch (Exception x)
        {
            this.Stop();
        }
        finally
        {

            if (myMutex!= null)
            {
                try
                {
                    myMutex.ReleaseMutex();
                }
                catch(Exception x)
                {
                    this.GetLogger().Warn("Unable to release mutex");
                }
            }
        }

У меня есть это в onStart(). Кроме того, в другом месте службы я синхронизируюсь по этому мьютексу.

Теперь в приложении я использую это так:

            Mutex myMutex= null;

        try
        {
            myMutex= Mutex.OpenExisting(this.myMutexName);
            myMutex.WaitOne();
//do required stuff


        }
        catch (WaitHandleCannotBeOpenedException wcbox)
        {
            //doesn't exist yet. service not running??
            this.GetLogger().Error("Background Service is not Running");
            shutdownApp();
        }
        finally
        {
            if (myMutex!= null)
            {
                try
                {
                    myMutex.ReleaseMutex();
                }
                catch (Exception x)
                {
                }
            }
        }

Мои проблемы:

  1. Когда служба запущена, приложение генерирует исключение WaitHandleCannotBeOpenedException, что означает, что оно не видит существующий мьютекс (я проверил это с помощью инструмента «WinObj», мьютекс существует в разделе «BaseNamedObjects» как тип «Мутант»). Почему? Я запускаю службу под той же учетной записью, с которой я вошел в систему. Даже без нее это не должно быть проблемой, потому что именованный мьютекс является общесистемным объектом, верно?

  2. Я не совсем понимаю, когда мьютекс будет уничтожен. В настоящее время я вижу, что мьютекс создается при запуске службы, а когда я останавливаю службу, я вижу, что мьютекс больше не существует (WinObj). Означает ли это, что мьютекс является сборщиком мусора, когда его никто не ждет и когда процесс-создатель завершается?

  3. В общем, каков жизненный цикл именованного системного мьютекса. В частности, когда он умирает?


person Brian    schedule 23.01.2013    source источник
comment
Вы пробовали префикс `Global`?   -  person Anton Kovalenko    schedule 24.01.2013
comment
@AntonKovalenko - я не хочу пробовать это, потому что это связано со службами терминалов и т. Д. Я хочу придерживаться имен без префикса, пока кто-нибудь не скажет, что то, что я делаю, может не сработать. Обработка пользовательских сценариев служб терминалов не является моим требованием   -  person Brian    schedule 24.01.2013
comment
Проблема в том, что службы (в современных окнах) по умолчанию используют глобальное пространство имен, а приложения в обычных сеансах входа по умолчанию — локальное. Следовательно, то, что вы делаете, может не сработать.   -  person Anton Kovalenko    schedule 24.01.2013
comment
Пространства имен @Brian не относятся к службам терминалов. Ваши службы и приложения работают в разных сеансах. В этом проблема.   -  person David Heffernan    schedule 24.01.2013


Ответы (2)


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

В нынешнем виде вы не указываете пространство имен. И хотя служба по умолчанию использует глобальное пространство имен, ваше интерактивное приложение будет использовать локальное пространство имен.

person David Heffernan    schedule 23.01.2013
comment
Дополнительную информацию см. в Конструктор Mutext на MSDN. - person Alexei Levenkov; 31.10.2015
comment
я знаю, что это старая тема (могу ли я сказать, что это каламбур) - верно ли это и для интерактивных сервисов? Я просмотрел MSDN, в котором действительно говорится то, что вы сказали, но он не углублялся, чтобы сказать, относится ли это также к интерактивным службам. - person cineam mispelt; 27.11.2017
comment
@cineam интерактивный сервис не существует - person David Heffernan; 27.11.2017
comment
@DavidHeffernan, я позволю себе не согласиться. вы можете посмотреть на обнаружение интерактивных сервисов [service]. это название Microsoft дало ему, так что я буду придерживаться его. - person cineam mispelt; 28.11.2017
comment
и для чего это стоит, это применимо (мой вопрос выше), я провел свое исследование вчера. ваше здоровье - person cineam mispelt; 28.11.2017
comment
@Cineam Интерактивные сервисы существовали в XP. В Висте их убрали. - person David Heffernan; 28.11.2017
comment
они были отключены по умолчанию, а не удалены. это просто бит реестра, чтобы включить их и использовать. - person cineam mispelt; 29.11.2017
comment
@cineammispelt Я так не думаю. Возможно, вы можете указать мне на этот параметр реестра. - person David Heffernan; 29.11.2017

@david Я использую инструмент под названием Google, чтобы легко найти его, и мы работаем в производстве с включенным обнаружением интерактивных служб с интерактивной службой. Обнаружение интерактивных служб нельзя запустить, если вы не переключите этот раздел реестра. Я не знаю, о чем здесь спор: он есть, он задокументирован, и Google может легко указать вам на него.

person cineam mispelt    schedule 01.12.2017