В самом компакте фреймворка нет.
Какая польза от мьютекса, если вы не можете назвать его?
Безымянный мьютекс называется локальным мьютексом. Вы по-прежнему можете использовать его для синхронизации между различными потоками в одном и том же процессе. Монитор, подобный ключевому слову lock, не имеет такой же функциональности. Как отмечает cacke, мьютекс не допускает рекурсивного входа. Кроме того, монитор нельзя использовать за пределами AppDomain. Кроме того, мьютекс можно использовать с такими полезными функциями, как WaitHandle. .WaitAll или WaitAny, где монитор нельзя использовать ни с одной из этих вещей.
Я что-то упускаю?
Нет — в .NET CF Framework вы не можете назвать мьютекс без помощи вызова платформы.
Как использовать мьютекс для защиты ресурса в нескольких приложениях, если я не могу назвать их?
Вы должны назвать их — и вы можете это сделать, вам просто нужно прибегнуть к некоторому вызову платформы. Система на базе Windows CE уже некоторое время поддерживает именованные мьютексы. Вы можете написать вызов P/Invoke, который сделает это самостоятельно:
[DllImport("Coredll.dll")]
public static extern IntPtr CreateMutex(IntPtr lpMutexAttributes, bool initialOwner, string lpName);
И используйте его как (например) CreateMutex(IntPtr.Zero, false, "MutexName");
Вам также придется написать вызовы P/Invoke для ReleaseMutex и < a href="http://msdn.microsoft.com/en-us/library/ms959878.aspx" rel="nofollow noreferrer">CloseHandle.
В частности, я хочу сделать свое приложение Windows Mobile 6.5 единственным экземпляром.
Именованный мьютекс — одно из решений. Другое решение, которое может сработать для вас, — использовать блокировку файлов.
- Создайте файл с именем foo.txt при запуске, если он не существует.
- Получите блокировку записи в файле файла с помощью
FileShare.None.
- Другой экземпляр не сможет установить для него блокировку записи, поскольку первый экземпляр имеет блокировку и не будет делиться ею. Перехватите исключение и завершите программу, поскольку она уже запущена.
Когда программа закроется, очистите блокировку. Даже если процесс аварийно завершится или завершится аварийно, блокировка файла должна быть снята, что позволит запустить другой экземпляр. Что-то вроде этого:
FileStream stream;
try
{
stream = new FileStream("lock.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
}
catch
{
MessageBox.Show("Program is already running.");
return;
}
//Put your application code here.
MessageBox.Show("Program is now running.");
stream.Close();
person
vcsjones
schedule
06.10.2011