穿入.net

时间:2011-03-15 18:37:04

标签: c# .net multithreading thread-safety

我正在使用.net 3.0。我怎样才能确保线程安全 - AddRange

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

2 个答案:

答案 0 :(得分:3)

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

使线程安全的最简单方法是不要仅仅为了调用Add2()而生成一个新线程。

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

答案 1 :(得分:2)

使用锁定语句。

http://msdn.microsoft.com/en-us/library/c5kehkcz(v=VS.100).aspx

EX。 :

Object obj = new Object();
private void Add1()
{ 
  lock(obj)
  {
    items.AddRange(C1.GetItems(p1, p2)); 
  }
} 
private void Add2() 
{ 
  lock(obj)
  {
    items.AddRange(C2.GetItems(p1, p2)); 
  }
}