多线程问题 - 向静态列表添加元素

Mic*_*tum 5 .net c# multithreading

好的,新手多线程问题:

我有一个Singleton类.该类有一个静态列表,基本上这样工作:

class MyClass {
    private static MyClass _instance;
    private static List<string> _list;
    private static bool IsRecording;

    public static void StartRecording() {
        _list = new List<string>();
        IsRecording = true;
    }

    public static IEnumerable<string> StopRecording() {
        IsRecording = false;
        return new List<string>(_list).AsReadOnly();
    }

    public MyClass GetInstance(){

    }

    public void DoSomething(){
        if(IsRecording) _list.Add("Something");
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上,用户可以调用StartRecording()来初始化List,然后对instance-method的所有调用都可以向列表添加内容.但是,多个线程可能会将实例保存到MyClass,因此多个线程可能会向列表中添加条目.

但是,列表创建和读取都是单个操作,因此多线程情况下通常的读写器问题不适用.我能看到的唯一问题是插入顺序很奇怪,但这不是问题.

我可以按原样保留代码,还是需要采取任何预防措施来进行多线程处理?我应该在实际应用程序中添加它不是字符串列表而是自定义对象列表(所以代码是_list.Add(新对象(somedata))),但这些对象只保存数据,除了调用之外没有代码到DateTime.Now.

编辑:澄清以下答案:DoSomething不能是静态的(这里的类是缩写的,有很多东西正在使用实例变量,但这些由构造函数创建,然后才读取).这样做是否足够好

lock(_list){
    _list.Add(something);
}

and

lock(_list){
    return new List<string>(_list).AsReadOnly();
 }
Run Code Online (Sandbox Code Playgroud)

还是我需要一些更深层次的魔法?

Hen*_*man 4

您当然必须锁定_list。由于您正在为 _list 创建多个实例,因此您无法锁定 _list 本身,但您应该使用类似以下内容的内容:

private static object _listLock = new object();
Run Code Online (Sandbox Code Playgroud)

顺便说一句,遵循一些最佳实践:

  • DoSomething()如图所示,可以是静态的,所以它应该是静态的。

  • 对于库类,推荐的模式是使静态成员线程安全,这适用于StartRecording(),StopRecording()DoSomething()

我还会进行StopRecording()设置_list = null并检查它是否为空DoSomething()

在你问之前,所有这一切只需要很少的时间,因此确实没有性能原因这样做。