2015-11-06 3 views
0

Я хочу, чтобы мой фоновый процесс не выполнял действие, если приложение открыто на переднем плане. Я нашел аналогичный вопрос, заданный here, но я не могу заставить его работать для меня. Когда мой фоновый процесс проверяет Mutex, он никогда не существует. Когда на переднем плане приложение начинает создать мьютекс так:Mutex и Windows Phone 8.1 Silverlight

public void Application_Launching(object sender, LaunchingEventArgs e) 
{ 
    var myMutex = new Mutex(false, "MUTEX_NAME"); 
} 

Я отпускаю его, когда на переднем плане приложение закрывается:

private void Application_Closing(object sender, ClosingEventArgs e) 
{ 
    var myMutex = new Mutex(false, "MUTEX_NAME"); 
    myMutex.ReleaseMutex(); 
} 

в фоновом процессе У меня есть следующие проверки:

bool IsMutexLocked() 
{ 
    var myMutex = new Mutex(false, "MUTEX_NAME"); 
    return myMutex.WaitOne(100); 
} 

Я предполагаю, что WaitOne возвращает true, если "MUTEX_NAME" не существует, или он существует, но освобождается после 100 мс. Я также пробовал использовать out createdNew в конструкторе Mutex и статические методы OpenExisting и TryOpenExisting, но безрезультатно.

ответ

1

Вы не блокируете свой мьютекс в главном приложении, вы просто создаете его (также без права собственности). Вы можете либо создать Mutex с первоначальной собственностью, либо позвонить WaitOne() при необходимости. Еще одна помощь at Joe Alabhari's blog.

public void Application_Launching(object sender, LaunchingEventArgs e) 
{ 
    var myMutex = new Mutex(true, "MUTEX_NAME"); 
    // or call myMutex.WaitOne() // here maybe some timeout handling 
} 

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

Обратите внимание на пару вещей - не оставляйте заброшенные мьютексы, смотрите, чтобы не собирать мусор, отпустите его, когда это необходимо. Есть много сообщений об этом объекте синхронизации, here you have a good pattern.

+0

Спасибо, что сработал! Последующий вопрос, если при сбое приложения переднего плана выйдет мьютекс? – kernanb

+1

@kernanb Нет, он не будет автоматически выпущен. Взгляните на шаблоны - повторное обращение в каждом случае происходит в * finally * блоке, в этом случае mutex выпущен независимо от того, было исключение или нет. – Romasz

Смежные вопросы