У меня есть несколько разделов кода, которые мне нужно защитить с помощью Mutex. Проблема заключается в том, что код выглядит примерно так:Нужно бить GC и уничтожить объект, когда он выходит из сферы действия
lock(mylockobject) {
if(!foo())
throw new MyException("foo failed");
if(!bar())
throw new MyException("bar failed");
}
Используя замок, он работает, как хотелось бы, но теперь мне нужно использовать семафор. Очевидная проблема здесь заключается в том, что если я получу mutex и foo() или bar(), то мне пришлось бы эксклюзовать мьютекс, прежде чем бросать каждое исключение.
В C++ я бы воспользовался областью действия объекта, созданного в стеке, и заблокировал мьютекс в конструкторе объекта, а затем отпустил его в деструкторе. С сборкой мусора .NET я не думал, что это сработает. Я написал тестовую программу и подтвердил, что если я что-то вроде этого:
public class AutoMutex
{
private Mutex _mutex;
public AutoMutex(Mutex mutex)
{
_mutex = mutex;
_mutex.WaitOne();
}
~AutoMutex()
{
_mutex.ReleaseMutex();
}
}
и затем код, как это: (? Финализации)
// some code here...
Mutex my_mutex = new Mutex(false, "MyMutex");
{ // scoping like I would do in C++
AutoMutex test = new AutoMutex(my_mutex);
test = null;
}
Деструктор не получает называют гораздо позже ,
Google еще не указал мне в правильном направлении, но я все еще работаю над этим ... Пожалуйста, дайте мне знать, как вы можете решить эту небольшую проблему, если это даже возможно.
Название шаблона в C++ здесь «Получение ресурса есть инициализация» и часто упоминается как «RAII.» Если вы ищете «RAII в C#», вы найдете, например, http://blogs.msdn.com/colinth/archive/2007/08/08/c-for-c-users-a-doesn-t -act-как-destructor.aspx. В C# мы вызываем «одноразовый шаблон», и вы можете читать, например, http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx. Вдоль этих строк вы также должны прочитать «try-finally» http://msdn.microsoft.com/en-us/library/zwc8s4fz.aspx. Наконец, не бросайте внутрь охраняемых регионов вещи, находящиеся в плохом состоянии. – jason
спасибо за ссылки! – Dave