Могу ли я создать потокобезопасные объекты с ContextBoundObject? - PullRequest
1 голос
/ 07 февраля 2011

У меня есть объект, который обслуживает несколько запросов (потоков) ... подумайте об объекте SqlConnection в нескольких потоках ....

Теперь я хочу создать безопасный для потока объект, который знает оконтекст потока, в котором он создан .

Так что, если Thread1 создает объект foo, а Thread2 пытается получить к нему доступ, объект foo игнорирует его и только «действует», если Thread1выполняется ...

Будет ли это делать ContextBoundObject?если да, каковы его ограничения?

Псевдокод

public class Foo
{       
   private int _threadId; 

   public void DoSomething()
   {
       (if thread.ManagedThreadId != _threadId) return;

      // Do some thread safe stuff
   }

}

Ответы [ 2 ]

0 голосов
/ 03 июня 2016

Да, вы можете достичь безопасности потока, реализовав ContextBoundObject и пометив класс атрибутом Synchronization.Однако это рекомендуется только в том случае, если вам нужна блокировка на уровне класса (т. Е. Для всех методов / свойств и т. Д.), И из-за этого иногда она склонна к тупику и плохому параллелизму.

Лучшее решение в тех случаях, когда блокировка требуется лишь немногим методам, - это ручная блокировка с использованием абстрактного, легкого и менее подверженного блокировкам ключевого слова блокировки.1005 *

0 голосов
/ 24 июня 2011

Поведение, которое вы хотите достичь, может быть достигнуто с помощью SynchronizationAttribute .

Однако использование этого атрибута позволит сериализовать доступ ко всем членам класса. С другой стороны, если некоторые методы класса не требуют синхронизации (например, статический метод, который не имеет общего состояния), использование атрибута Synchronization может привести к снижению производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...