警惕beginInvoke的性能陷阱

 Control.BeginInvoke用于异步更新GUI上边的数据,通过是辅助线程得到数据之后需要更新到UI线程上边,由于和UI线程不在一个线程上运行,当需要访问UI上的控件的时候,就会抛出异常。

通常使用Control.BeginInvoke的方法是,使用的是.Net Framework提供的Fun<> 和Action<>等预定义类型。如

         /// <summary>
        /// 接收到新数据
        /// </summary>
        /// <param name="Data"></param>
        private void dtm__OnNewRow(List<string> Data)
        {
            Action<List<string>> myFun = AddNewRowToTable;       
            this.BeginInvoke(myFun, new object[] { Data});
        }

        private void AddNewRowToTable(List<string> data)
        {
           //do something
         }

 这里string 是值类型,所以在调用的过程中会尝试多次的 对象-值和值-对象的封箱和拆箱操作。。引起性能瓶颈。

解决方法是使用 MethodInvoker 的匿名方法,代码如下:

  /// <summary>
        /// 接收到新数据
        /// </summary>
        /// <param name="Data"></param>
        private void dtm__OnNewRow(List<string> Data)
        {
            Action<List<string>> myFun = AddNewRowToTable;
            this.BeginInvoke((MethodInvoker)delegate()
            {
                Row r = new Row();
                foreach (string s in Data)
                {
                    r.Cells.Add(new Cell(s));
                }
                XPtbData.TableModel.Rows.Add(r);

                if (dtm_.DataTableWorkingMode == SensorWorkingMode.One_Triggle_Sensor
                    || dtm_.DataTableWorkingMode == SensorWorkingMode.Two_Triggle_Sensor)
                    UpdateSummaryTable();
            });

            //this.BeginInvoke(myFun, new object[] { Data});
        }

        private void AddNewRowToTable(List<string> data)
        {
            // do something
        }

 

转载于:https://www.cnblogs.com/lvchengwei/archive/2012/12/29/2839425.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值