【问题标题】:C# access method concurrencyC#访问方法并发
【发布时间】:2021-01-08 08:54:35
【问题描述】:

我想了解并发将对象传递给多个类是否存在一些问题。示例

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);
  
}

这是一个通用示例,只是为了给您一个想法。 谢谢大家:)

【问题讨论】:

  • 使用你分享的具体代码,不会有任何问题。
  • 既然你不同时修改和/或读取数据,那没关系。
  • 以上两个 cmets 都基于这样一个事实,即您的所有 interfaceA.doSomething() 所做的都是一个线程安全的 Console.WriteLine("Static string");。这个问题的答案很大程度上取决于interfaceA.soSomething() 做了什么
  • 请将您的示例代码修正为有效的 C# 代码。接口名称不能以# (CS1040) 开头
  • 您的示例中井号 (#) 的含义是什么?

标签: c# .net-core concurrency


【解决方案1】:

在编写多线程代码时,您应该注意潜在的危险。如果不是,那就不要写多线程代码!

作为 .Net 框架中的一般经验法则,静态方法应该是线程安全的,但实例方法不是,除非在 cmets 中另有规定。您的代码碰巧只调用了一个静态的、线程安全的方法。但是,如果您对其进行任何更改,您可能会使代码成为非线程安全的。

有很多资源可以描述潜在问题,远远超过此处可以描述的内容。例如Microsofts best practices.jon skeets article on the subject

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 2014-04-24
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2013-10-12
    • 1970-01-01
    相关资源
    最近更新 更多