线程间操作无效:从不是创建控件“ListView1”的线程访问它。
调试时报这个错误是:微软提供的安全机制,为了防治产生死锁,两个不同的线程同时争用同一个资源。
有两种方法解决
1、把CheckForIllegalCrossThreadCalls设置为false
2,用委托解决
例子如下
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private readonly int Max_Item_Count = 10000;
private void Form1_Load(object sender, EventArgs e)
{
}
private void btn_Start_Click(object sender, EventArgs e)
{
new Thread
(
(ThreadStart)(delegate()
{
for (int i = 0; i < Max_Item_Count; i++)
{
//此处警惕值类型装箱造成的“性能陷阱”
listView1.Invoke((MethodInvoker)delegate()//使用委托解决线程间的操作无效问题。
{
listView1.Items.Add
(
new ListViewItem
(
new string[]
{
i.ToString(), string.Format("This is No.{0} item", i.ToString())
}
)
);
});
}
})).Start();
//new Thread//未用委托,调试时会报错。
// (
// (ThreadStart)(delegate()
// {
// for (int i = 0; i < Max_Item_Count; i++)
// {
// //此处警惕值类型装箱造成的“性能陷阱”
// listView1.Items.Add
// (
// new ListViewItem
// (
// new string[]
// {
// i.ToString(), string.Format("This is No.{0} item", i.ToString())
// }
// )
// );
// };
// }
// )).Start();
}
}