• 线程间操作


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

         }
    }

  • 相关阅读:
    并发编程学习笔记之Java存储模型(十三)
    并发编程学习笔记之原子变量与非阻塞同步机制(十二)
    并发编程学习笔记之构建自定义的同步工具(十一)
    并发编程学习笔记之显示锁(十)
    并发编程学习笔记之可伸缩性(九)
    并发编程学习笔记之死锁(八)
    并发编程学习笔记之自定义配置线程池(七)
    并发编程学习笔记之取消和关闭(六)
    并发编程学习笔记之线程池(五)
    并发编程学习笔记之并发工具类(四)
  • 原文地址:https://www.cnblogs.com/yanyao/p/5359952.html
Copyright © 2020-2023  润新知