线程间操作

本文探讨了在编程中遇到线程间操作无效问题时,如何通过设置CheckForIllegalCrossThreadCalls属性为false及使用委托来解决。通过实例演示了在窗体中操作ListView控件时避免死锁的方法。

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

     }
}

 

转载于:https://www.cnblogs.com/yanyao/p/5359952.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值