Использование анонимных методов в операторе блокировки - PullRequest
2 голосов
/ 20 июля 2011

Я должен организовать потокобезопасное удаление элементов из коллекции, используя анонимный метод.Примерно так.

...
lock(this.set)
{
   ...
   this.set.Add(item);

   action(()=>{
      lock(this.set)
      {
         this.set.Remove(item);
      }
   });
}
...

Анонимный метод будет выполнен к тому времени, вероятно, из другого потока.Является ли этот способ операторов блокировки правильным?Есть ли здесь какие-то риффы, которые я должен принять во внимание?

Заранее спасибо.

Ответы [ 2 ]

4 голосов
/ 20 июля 2011

Однако это сработает. Вы смотрели на ConcurrentCollections в .NET 4? Они внутренне безопасны

0 голосов
/ 20 июля 2011

Это зависит от того, что action делает с делегатом (сформированным как лямбда-выражение вашего случая).Если он выполняет его синхронно, то второй lock не имеет смысла.Тем не менее, это было бы безопасно, так как lock может быть повторно введен.Если он выполняет его асинхронно в другом потоке, то вы можете заблокировать оба потока, если action ожидает завершения любого вызова делегата.Это был бы единственный «рифф», о котором я могу подумать.

...