zoukankan      html  css  js  c++  java
  • 线程间操作

    线程间操作无效:从不是创建控件“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();

         }
    }

  • 相关阅读:
    利用哈希map快速判断两个数组的交集
    TCP协议中的三次握手和四次挥手(图解)-转
    PC,移动端H5实现实现小球加入购物车效果
    HQL和SQL的区别
    Java泛型详解,通俗易懂只需5分钟
    经典的 Fork 炸弹解析
    Java并发之AQS详解
    Java不可重入锁和可重入锁的简单理解
    Codeforces 1215F. Radio Stations
    Codeforces 1215E. Marbles
  • 原文地址:https://www.cnblogs.com/yanyao/p/5359952.html
Copyright © 2011-2022 走看看