2009-07-30 29 views
0

我想从一个线程向另一个线程添加项目并从另一个线程删除项目。但是,我不确定是否会遇到多个线程访问同一个对象的问题。我已经读了一些关于锁的声明,但我不知道如何实现这一点。总之,问题是,我如何确保线程安全地访问我的列表。在.Net中添加和删除列表项的线程安全方式

回答

4

使用SyncRoot上到IList中:

lock(SomeList.SyncRoot) {...} 
+0

我不认为IList有SyncRoot吗?这只是ArrayLists? – 2009-07-30 11:02:27

+2

是的。这是一个明确的接口实现。 ((IList)someList).SyncRoot – 2009-07-30 11:14:22

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

我也许还应该补充说,对于比这个基本示例更复杂的任何东西,您可能都希望对列表本身使用不同的对象。

private object lockObj = new Object(); 
     private void DoOtherThreadWork() { 
       while (true) { 
        //so something with thread. Sleep it, whatever... 
        lock(_lockObj) { 
1

如果你正在做一个生产者/消费者系统 - 这听起来像你 - a synchronized Queue听起来比较合适的结构,而不是一个列表。