C# net中的线程

C# net中的线程,c#,.net,multithreading,thread-safety,C#,.net,Multithreading,Thread Safety,我正在使用.NET3.0。如何确保是threadsafe-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

我正在使用.NET3.0。如何确保是threadsafe-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));
    }
}
公共类GetItems
{
列表项=新列表();
字符串p1;
字符串p2;
公共列表获取(字符串para1、字符串para2)
{
p1=para1;
p2=para2;
ThreadStart ts1=新的ThreadStart(添加1);
ThreadStart ts2=新的ThreadStart(添加2);
螺纹th1=新螺纹(ts1);
螺纹th2=新螺纹(ts2);
尝试
{
监控。输入(项目);
th1.Start();
th2.Start();
th1.Join();
th2.Join();
}
最后
{
监控、退出(项目);
}
退货项目;
}
私有void Add1()
{
items.AddRange(C1.GetItems(p1,p2));
}
私有void Add2()
{
items.AddRange(C2.GetItems(p1,p2));
}
}

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

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


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

使用lock语句

例:


考虑到对一个对象的简单锁定将使这两个对象按顺序运行,这似乎是最好的建议。除非实际的生产方法做得更多,否则线程化似乎毫无意义。也许GetItems需要在后台运行?用一个不切实际的例子正确回答一个问题。
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)); 
  }
}