Есть ли атрибут, чтобы пометить класс или метод для обеспечения безопасности потоков в .NET? - PullRequest
6 голосов
/ 18 марта 2009

В .NET как я могу узнать, является ли класс или метод потокобезопасным или нет? Это по умолчанию не потокобезопасно?

Ответы [ 6 ]

6 голосов
/ 18 марта 2009

Это не атрибут для этого: вы должны читать документацию для каждого интересующего вас элемента. Вы не можете сделать что-то поточно-безопасное, просто добавив к нему атрибут. Это все равно, что взять апельсин и наклеить на него наклейку с надписью «Apple».

Конечно, то же самое верно для сериализации, и это не остановило их там, но все же: нет атрибута. Прочитайте документы.

2 голосов
/ 09 апреля 2013

Нет, и это было бы бессмысленно.

Давайте предположим, что у меня есть потокобезопасный список, он имеет три Thread Safe ™ метода:

void Add( something);
void Remove(index);
int GetCount();
something GetElementAt(index);

Тема первая:

for 1 to 100 do
 list.Add(12);

Тема два и три :

while( list.GetCount() >0)
{
    list.Remove(0);
}

Приведенный выше код сбоит (рано или поздно), потому что список может измениться между вызовами GetCount и Remove

1 голос
/ 24 марта 2009

Можно сделать весь доступ к вашему последовательному объекту через IContributeObjectSink/IContextAttribute, хотя это будет страдать от значительного снижения производительности, так как для вашего объекта потребуется подкласс MarshalByRefObject, накладные расходы на создание контекста и т. Д.

1 голос
/ 18 марта 2009

Я получил ответ от Джоэла Кохорна на этом, было бы легко «подделать» такие заявления.

Почему бы не добавить потокобезопасный текст в описание функции

0 голосов
/ 18 апреля 2018

Чтобы пометить класс как потокобезопасный, вы можете использовать атрибут уровня класса [Synchronization] из пространства имен System.Runtime.Remoting.Contexts. Помните, что вы должны наследовать свой класс от ContextBoundObject, чтобы сделать его контекстно-зависимым.

using System.Runtime.Remoting.Contexts;

// Every member of this class is thread-safe... 
[Synchronization]
public class ThreadSafeClass: ContextBoundObject
{
        // Some functionality... 

}
0 голосов
/ 18 марта 2009

Не существует сценария использования для синхронизации класса, поскольку для метода используется следующий стиль кодирования:

using System.Runtime.CompilerServices;
[MethodImpl(MethodImplOptions.Synchronized)]   
void MyMethod()   
{   
DoSomething();   
}  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...