Параллелизм методов доступа к C #

#c# #.net-core #concurrency

#c# #.net-core #параллелизм

Вопрос:

Я хотел бы понять, есть ли какие-то проблемы с параллелизмом, передающим объект нескольким классам. Пример

 class A: interfaceA{
    private object attribute;
    public A ()
    {
    }

    public bool doSomething(){
        Console.writeline("Happy new year :)");
        // other non static operations
    }
}

class B: interfaceB{
    private InterfaceA classA;

    public B(interfaceA classA){
       this.classA = classA;
    }

    public bool elaborate(){
       return classA.doSomething();
    }
}

class C: interfaceC{
    private InterfaceA classA;

    public C(interfaceA classA){
       this.classA = classA;
    }

    public bool elaborate(){
       return classA.doSomething();
    }
}


public void Main(){
   classA A = new classA();
   classB B = new classB(A);
   classC C = new classC(A);
  
}
 

Это общий пример, просто чтобы дать вам представление.
Спасибо вам всем 🙂

Комментарии:

1. С конкретным кодом, которым вы поделились, проблем не будет.

2. Поскольку вы не изменяете и / или не считываете данные одновременно, все в порядке.

3. Оба комментария выше основаны на том факте, что все, что вы interfaceA.doSomething() делаете Console.WriteLine("Static string"); , — это то, что является потокобезопасным. Ответ на этот вопрос во многом зависит от того, что interfaceA.soSomething() делает

4. Пожалуйста, исправьте ваш пример кода, чтобы он был допустимым кодом на C #. имя интерфейса не может быть запущено с # (CS1040)

5. Каково значение знака хэша (#) в вашем примере?

Ответ №1:

При написании многопоточного кода вы должны знать о потенциальных опасностях. Если это не так, то не пишите многопоточный код!

В качестве общего эмпирического правила в.Net framework, статические методы должны быть потокобезопасными, но методы экземпляра не являются, если иное не указано в комментариях. Ваш код вызывает только статический потокобезопасный метод. Но вы, скорее всего, сделаете код не потокобезопасным, если внесете в него какие-либо изменения.

Существует множество ресурсов, описывающих потенциальные проблемы, гораздо больше, чем можно описать здесь. Например, рекомендации Microsoft. Или статья Джона Скита по этому вопросу