有线程安全问题吗?

时间:2013-12-29 17:11:18

标签: c# multithreading list thread-safety

我有这段代码:

public class c1
{
   private List<MyObject> myObjects = new List<MyObject>();

   button1_click(object sender, EventArgs e)
   {
       myObjects.Add(o1);
       button1.Enabled = false;
       Task.Factory.StartNew(() => 
       {
           Thread.sleep(10000);
           myObjects.remove(o1);
           button1.Enabled = true;
       });
   }

   button2_click(object sender, EventArgs e)
   {
       myObjects.Add(o2);
       button2.Enabled = false;
       Task.Factory.StartNew(() => 
       {
           Thread.sleep(10000);
           myObjects.remove(o2);
           button2.Enabled = true;
       });
   }
}

o1和o2是包含字段ID(长)和名称(字符串)的MyObject,假设它们已初始化,并且表单中有2个按钮。

是否存在线程安全问题?

2 个答案:

答案 0 :(得分:1)

是的,存在线程问题。 button2_click(所以myObjects.Add(o2))可以在第一个线程(由button1_click启动的线程)执行的同时执行(myObjects.remove(o1)

答案 1 :(得分:0)

是。列表不是线程安全的;添加;使用不同的线程删除会导致不一致(因为在列表后面,它是一个数组); 使用ConcurrentBag