Как правильно использовать глобальный мьютекс в WPF? - PullRequest
2 голосов
/ 02 мая 2010

Итак, я нашел эту информацию Что такое хороший шаблон для использования Global Mutex в C #?

Но это основано на основной точке входа стандартного приложения. Как вы измените это, чтобы работать для модели событий WPF запуска приложения?

Ответы [ 4 ]

0 голосов
/ 29 сентября 2011

Быстрый ответ:

В App.xaml: изменить приложение на InstanceAwareApplication

В App.xaml.cs: изменить приложение на InstanceAwareApplication и переопределить OnStartup (StartupEventArgs e, bool isFirstInstance)

Тогда следуйте примеру здесь: http://wpfinstanceawareapp.codeplex.com/SourceControl/changeset/view/53538#530411

0 голосов
/ 10 июня 2010

Вы запрашиваете это для создания WPF-приложения с одним экземпляром ? Если это так, я рекомендую вам взглянуть на этот проект , который я создал на CodePlex. Он предоставляет производный класс Application, который инкапсулирует логику для создания приложения WPF с поддержкой одного экземпляра / нескольких экземпляров, что также касается взаимодействия между экземплярами (то есть основное приложение может получать аргументы, передаваемые в последующий экземпляр). Исходный код доступен, так что вы даже можете проверить, что глобальный мьютекс и некоторые WaitHandle используются для обеспечения синхронизации.

Чтобы ответить непосредственно на ваш вопрос, правильное место для получения глобального мьютекса находится внутри переопределения метода Application.Startup, так как он вызывается в начале (более или менее) метода Application.Run, который может считается эквивалентной программе Main (конечно, это не одно и то же, но для цели достаточно одного приложения).

0 голосов
/ 02 октября 2010

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

Поскольку это означает, что функция возвращает завертывание вызова Startup в мьютекс, как в исходном примере, который я связал, блокировка мьютекса снимается вскоре после запуска. Если вы либо измените способ, с помощью которого Statup открывает главное окно, с Show () на ShowDialog (), то он будет работать как положено.

0 голосов
/ 02 мая 2010

Когда я впервые ответил на это, я прочитал и написал WPF, но подумал «WCF». Глупый я. Вот мой новый ответ:

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

...