2011-03-15 88 views
2

我正在使用.net 3.0。如何确保线程安全 - AddRange线程在.net中

public class GetItems 
{ 
    List<Item> items = new List<Item>(); 
    string p1; 
    string p2; 

    public List<Item> Get(string para1, string para2) 
    { 
     p1 = para1; 
     p2 = para2; 

     ThreadStart ts1 = new ThreadStart(Add1); 
     ThreadStart ts2 = new ThreadStart(Add2); 

     Thread th1 = new Thread(ts1); 
     Thread th2 = new Thread(ts2); 

     try 
     { 
      Monitor.Enter(items); 

      th1.Start(); 
      th2.Start(); 

      th1.Join(); 
      th2.Join(); 
     } 
     finally 
     { 
      Monitor.Exit(items); 
     } 
     return items; 
    } 
    private void Add1() 
    { 
     items.AddRange(C1.GetItems(p1, p2)); 
    } 
    private void Add2() 
    { 
     items.AddRange(C2.GetItems(p1, p2)); 
    } 
} 

回答

3

您是否需要生成一个新线程来调用Add2()?

使它成为线程安全的最简单方法是不产生一个新线程来调用Add2()。

而是,调用Add1(),然后使用相同的线程调用Add2()。

+2

考虑到对这里的对象的简单锁定会使这两个按顺序运行,这似乎是最好的建议。除非实际的生产方法做得更多,否则根本没有任何意义。也许GetItems需要在后台运行? – 2011-03-15 18:50:17

+0

用不切实际的例子回答一个问题的正确答案。 – 2011-03-15 18:55:17