System.Threading.Mutex с сервисом и консолью - PullRequest
2 голосов
/ 06 октября 2011

моя программа работает как служба или с консоли.Я создал System.Threading.Mutex для запуска только одного из двух режимов.Вот мой код

public class MyServer 
{
// Private variable
System.Threading.Mutex serverMutex;

public MyServer ()
{
    bool createdNew;
    ServerMutex = new System.Threading.Mutex(true, "MyServerMutex", out createdNew);
    if (!createdNew)
    {
        throw new Exception("Another server instance is running");
    }
}
}

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

Есть идеи?Мне интересно, потому что я думаю, что он уже работал несколько месяцев назад, когда я реализовал эту функцию.

Я использую .NET 4.0.

Спасибо, Фредди

Ответы [ 2 ]

7 голосов
/ 06 октября 2011

Вероятно, проблема в том, что ваша служба работает с другими учетными данными, поэтому мьютекс не является "общим" для пользователей / сеансов ...
Вы должны добавить префикс имени мьютекса к "Global\"
Посмотрите на этот хороший пост .

3 голосов
/ 06 октября 2011

Как сказал Марко , ваш мьютекс должен быть назван примерно так:

string.Format(@"Global\{0}", mutexName);

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

var users = new SecurityIdentifier(WellKnownSidType.BuiltinUsersSid, null);

var security = new MutexSecurity();
security.AddAccessRule(new MutexAccessRule(users, MutexRights.Synchronize, AccessControlType.Allow));
security.AddAccessRule(new MutexAccessRule(users, MutexRights.Modify, AccessControlType.Allow));

new Mutex(false, name, out createdNew, security);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...