Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在.Net中从列表中添加和删除项的线程安全方法_.net_Multithreading_Locking_Thread Safety - Fatal编程技术网

在.Net中从列表中添加和删除项的线程安全方法

在.Net中从列表中添加和删除项的线程安全方法,.net,multithreading,locking,thread-safety,.net,Multithreading,Locking,Thread Safety,我想从一个线程向列表中添加项目,从另一个线程中删除同一列表中的项目。但是,我不确定多个线程访问同一对象是否会遇到问题。我已经读了一些关于lock语句的内容,但我不知道如何实现它。简言之,问题是,如何确保线程安全地访问我的列表。使用SyncRoot进入IList: lock(SomeList.SyncRoot) {...} 在IList中使用SyncRoot: lock(SomeList.SyncRoot) {...} 下面是一个非常粗略的锁定示例。现在,在列表中添加和删除时,两个线程都是安全

我想从一个线程向列表中添加项目,从另一个线程中删除同一列表中的项目。但是,我不确定多个线程访问同一对象是否会遇到问题。我已经读了一些关于lock语句的内容,但我不知道如何实现它。简言之,问题是,如何确保线程安全地访问我的列表。

使用SyncRoot进入IList:

lock(SomeList.SyncRoot) {...}

在IList中使用SyncRoot:

lock(SomeList.SyncRoot) {...}

下面是一个非常粗略的锁定示例。现在,在列表中添加和删除时,两个线程都是安全的。这不是一个如何创建和使用线程的示例,只是一个如何使用锁的示例

  Class A{
            private List<int> _list = new List<int>();

            private void DoOtherThreadWork() {
                while (true) {
                    //so something with thread. Sleep it, whatever...
                    lock(_list) {
                        _list.Add(1);
                    }
                }    
            }

            private void StartWorking(object sender, EventArgs e) {
                Thread worker = new Thread(DoOtherThreadWork);
                worker.Start();

                while (true) {
                    lock(_list) {
                        if (_list.Count > 0) {
                            _list.RemoveAt(0);
                        }
                    }
                }
            }
    }

下面是一个非常粗略的锁定示例。现在,在列表中添加和删除时,两个线程都是安全的。这不是一个如何创建和使用线程的示例,只是一个如何使用锁的示例

  Class A{
            private List<int> _list = new List<int>();

            private void DoOtherThreadWork() {
                while (true) {
                    //so something with thread. Sleep it, whatever...
                    lock(_list) {
                        _list.Add(1);
                    }
                }    
            }

            private void StartWorking(object sender, EventArgs e) {
                Thread worker = new Thread(DoOtherThreadWork);
                worker.Start();

                while (true) {
                    lock(_list) {
                        if (_list.Count > 0) {
                            _list.RemoveAt(0);
                        }
                    }
                }
            }
    }

如果你在做生产者/消费者系统——听起来像是——听起来像是更合适的结构,而不是列表。

如果你在做生产者/消费者系统——听起来像是——听起来像是更合适的结构,而不是列表。

我认为IList没有SyncRoot,是吗?只是阵列列表?是的。这是一个显式的接口实现。((IList)someList)。SyncRoot我认为IList没有SyncRoot,是吗?只是阵列列表?是的。这是一个显式的接口实现。((IList)someList).SyncRootI正在尝试这样做,但在.NET3.5中,它似乎已被删除。我正在尝试这样做,但在.NET3.5中,它似乎已被删除。