Я пытаюсь упростить задачу. Вот мой код:
If Threading.Monitor.TryEnter(syncRoot) Then
Try
'do something
Finally
Threading.Monitor.Exit(syncRoot)
End Try
Else
'do something else
End If
По шумности это даже хуже, чем ReaderWriterLock. Я могу использовать C# или VB, поэтому ответы, относящиеся к любому из них, будут приветствоваться.





Это очень похоже на ваш последний пост, и я ожидал бы аналогичного ответа. Единственное существенное отличие состоит в том, что вы можете вернуть «null» из вашего метода, если тайм-аут завершается неудачно - тогда «Dispose ()» не вызывается, и вы можете легко проверить значение:
using(var token = GetLock(syncLock, timeout)) {
if (token != null) { ... }
}
Единственная реальная проблема заключается в том, что вы не обязательно хотите добавлять метод расширения к "объекту" (или даже к "T, где T: класс") ...
Джон Скит уже рассматривал это в прошлом - стоит посмотреть.
Использовать делегата?
Например.
public bool TryEnter(object lockObject, Action work)
{
if (Monitor.TryEnter(lockObject))
{
try
{
work();
}
finally
{
Monitor.Exit(lockObject);
}
return true;
}
return false;
}
Совершенно бесполезен для VB (без анонимных делегатов Action), но я вижу, что он работает с C#. Можете показать, как вы это предвидите?
Простейшим будет лямбда: TryEnter (obj, () => {... code ...})), где возврат сообщает вам, было ли это сделано или нет.
Теперь, когда в VB 10 есть анонимные делегаты, это мое любимое решение.
Передача возможного нуля в блок using - изящный трюк. Но мне это все еще кажется бессмысленным.