gpt4 book ai didi

c# - 多线程问题——向静态列表中添加一个元素

转载 作者:太空狗 更新时间:2023-10-29 22:35:18 25 4
gpt4 key购买 nike

好的,新手多线程问题:

我有一个单例类。该类有一个静态列表,基本上是这样工作的:

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

基本上,用户可以调用 StartRecording() 来初始化一个列表,然后对实例方法的所有调用都可以向列表中添加内容。但是,多个线程可能持有 MyClass 的实例,因此多个线程可能会向列表添加条目。

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

我可以保留代码原样吗,或者我需要为多线程采取任何预防措施吗?我应该补充一点,在实际应用程序中,这不是一个字符串列表,而是一个自定义对象列表(因此代码是 _list.Add(new Object(somedata))),但是这些对象只保存数据,除了调用之外没有代码到 DateTime.Now。

编辑: 一些答案后的澄清:DoSomething 不能是静态的(这里的类是缩写的,有很多东西正在使用实例变量,但这些是由构造函数和然后只阅读)。做得够好吗

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

and

lock(_list){
return new List<string>(_list).AsReadOnly();
}

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

最佳答案

您当然必须锁定 _list。并且由于您正在为 _list 创建多个实例,因此您不能锁定 _list 本身,但您应该使用类似的东西:

private static object _listLock = new object();

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

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

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

我也会让 StopRecording() 设置 _list = null 并在 DoSomething() 中检查它是否为 null。

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

关于c# - 多线程问题——向静态列表中添加一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352049/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com