Мьютекс может блокировать несколько процессов. Это было бы полезно в Windows Phone, если у вас запущена запланированная задача, требующая эксклюзивного доступа к ресурсу. Для блокировки мьютекса между процессами Mutex должно быть присвоено имя.
Монитор может блокироваться только внутри процесса.
Mutex Пример:
Задача приложения телефона:
public class DatabaseService
{
private Mutex _mut=new Mutex("mutex control",false);
public void AddToDatabase(DbObject row)
{
mut.WaitOne();
SaveRow(row);
mut.ReleaseMutex();
}
}
Класс запланированных задач:
public class ResourceUtilisation
{
private Mutex _mut=new Mutex("mutex control",true);
//.. does stuff
private static void UseResource()
{
// Wait until it is safe to enter.
_mut.WaitOne();
//Go get dataabse and add some rows
DoStuff();
// Release the Mutex.
_mut.ReleaseMutex();
}
}
В приведенном выше примере мы разрешаем только одному приложению одновременно доступ к локальному ресурсу базы данных. Вот почему мы использовали Mutex.
Пример монитора (с использованием синтаксиса блокировки):
Задача приложения телефона:
public class DatabaseService
{
private object _locker=new object();
public void AddToDatabase(DbObject row)
{
lock(_locker)
SaveRow(row);
}
}
Класс запланированных задач:
public class ResourceUtilisation
{
private object _locker=new object();
//.. does stuff
private static void UseResource()
{
//Go get dataabse and add some rows
lock(_locker)
DoStuff();
}
}
В этом примере мы можем остановить более одного потока приложения, входящего в SaveRow, и мы можем остановить более одного потока ScheduledTask от входа в метод DoStuff. Что мы не можем сделать с монитором, так это убедиться, что только один поток одновременно обращается к локальной БД.
В этом и заключается разница. Монитор намного быстрее, чем Mutex.