2013-11-30 3 views
0

Я работаю с классом, который управляет содержимым игры, и я хотел бы знать, как я могу блокировать вызовы метода dispose без блокировки на общий доступ к хранилищу, замок? Сами рабочие методы являются потокобезопасными и могут выполняться параллельно, поэтому я не хочу блокировать эти методы с помощью общей блокировки, которую метод-метод пытается получить при его запуске.Block IDisposable.Dispose из потокобезопасных методов

public void DoSomething() 
{ 
    lock (method1Lock) { /* ... */ } 
} 

public void Dispose() 
{ 
    lock (method1Lock) 
    lock (method2Lock) 
    lock (methodXLock) 
    { 

    } 
} 

не подходит в данном случае, поскольку, как упоминалось ранее, методы (DoSomething в данном случае) может работать параллельно.

+3

Какой смысл блокировки в '.Dispose()'? Думаю, я не понимаю, почему * вам нужно блокировать здесь. * Что * работает параллельно? Это то, что должно блокировать выполнение до тех пор, пока методы не будут выполняться, а также попытаться обеспечить выполнение структуры выполнения в этом логическом уровне. – Joe

+0

Здесь что-то вонючее. Вы передаете право собственности на эти объекты? Тот, кто создал экземпляр, как правило, несет ответственность за его удаление. – Steven

+0

Аналогичный случай: http://stackoverflow.com/questions/8927878/what-is-the-correct-way-of-adding-thread-safety-to-an-idisposable-object –

ответ

0

Использовать ReaderWriterLock. Пусть код Method... берет сторону чтения и Dispose сторону записи (которая является исключительной).

+0

Спасибо, это решение, которое я искал. –

+0

Вы убедились, что методы фактически планируются до того, как вы удалите объекты? Значит, знаете ли вы, что объект не будет удален до того, как один или несколько методов смогут выполнить его? –

+0

@ LasseV.Karlsen Нет, я не могу называть вызовы одному из методов. Как уже упоминалось, это загрузчик активов, который, хотя ** очень маловероятен, даже не может быть использован вообще. –

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