2011-03-15 62 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