线程间操作

线程间操作无效:从不是创建控件“ListView1”的线程访问它。

调试时报这个错误是:微软提供的安全机制,为了防治产生死锁,两个不同的线程同时争用同一个资源。

有两种方法解决

1、把CheckForIllegalCrossThreadCalls设置为false

2,用委托解决

例子如下

窗体中有一个ListView控件命名为listView1,并将View设置为Detail,添加两个ColumnHeader;一个Button命名为btn_Start,设计视图如下:

 

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

     }
}

 

posted on 2016-04-06 16:42  +=  阅读(274)  评论(0编辑  收藏  举报

导航