2011-02-07 4 views
1

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

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

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

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

Псевдокод

public class Foo 
{  
    private int _threadId; 

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

     // Do some thread safe stuff 
    } 

} 
+1

Прежде чем идти, как это сделать? можете ли вы предоставить подробную информацию о том, почему вы хотите это сделать? возможно, есть лучшие решения для достижения того, что вы ищете. –

+0

Я хочу сделать это, потому что хочу иметь экземпляры «Thread-Safe» ... включая вызовы методов и доступ к свойствам. Я не верю в «Этот объект небезопасен для многопоточного доступа». –

ответ

0

Поведение вы хотите достичь может быть сделано с помощью SynchronizationAttribute.

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

+0

Таким образом, единственный способ добиться «автоматической» безопасности потоков - проблемы с производительностью! –

+0

@ JalalEl-Shaer * Любая опция для обеспечения безопасности потоков имеет проблемы с производительностью. По крайней мере, это будет означать, что некоторые части вашего кода не могут выполняться параллельно. Если бы это не имело никаких последствий, считаете ли вы, что в .NET будут какие-то небезопасные объекты? : D – Luaan

+0

@ Luaan Я считаю, что все объекты должны быть потокобезопасными и иметь наилучшую производительность. : D –

0

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

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

Надеюсь, что это поможет!

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