我有这段代码:
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个按钮。
是否存在线程安全问题?
答案 0 :(得分:1)
是的,存在线程问题。 button2_click
(所以myObjects.Add(o2)
)可以在第一个线程(由button1_click
启动的线程)执行的同时执行(myObjects.remove(o1)
)
答案 1 :(得分:0)
是。列表不是线程安全的;添加;使用不同的线程删除会导致不一致(因为在列表后面,它是一个数组); 使用ConcurrentBag