zoukankan      html  css  js  c++  java
  • 跨线程访问控件的方法

    主窗体创建的控件相当于主线程管理,在分线程使用的时候会产生跨线程访问的问题,这时需要如下判断写法,即可解决

    if (lblNum2.InvokeRequired)
                        {
                            lblNum2.Invoke(new Action<string>(s => { this.lblNum2.Text = s; }), Thread.CurrentThread.ManagedThreadId.ToString());
                        }
                        else 
                        {
                            this.lblNum2.Text = Guid.NewGuid().ToString("N");
                        }

     但是据大神说,微软推荐的方式是使用委托的方式,写法如下,

     private delegate void SetPos(object state);//代理
    
     public void StartAcceptSocket(object state)
    {
            SetPos setpos = new SetPos(StartAcceptSocket);
            //这里要注意委托参数的一致性
            this.Invoke(setpos, new object[] { state });      
    }    
    
    //最后使用了线程池去掉用这个方法
    
    ThreadPool.QueueUserWorkItem(this.StartAcceptSocket,object参数);
    //写法2  2015/06/11
     private string GetListText(int item,int subItem)
            {
                string retStr=string.Empty;
                if(this.InvokeRequired)
                {
                    this.Invoke(new Action<int>(x => { retStr = this.listView.Items[x].SubItems[subItem].Text; }), item);
                }
                else
                {
                    retStr = this.listView.Items[item].SubItems[2].Text;
                }
                return retStr;
            }
    //调用
    if (this.InvokeRequired)
                    {
                        
                        worksheet.Cells[i + 2, 0].PutValue(GetListText(i,2));
                        worksheet.Cells[i + 2, 0].SetStyle(styleTextCenter);
                        worksheet.Cells[i + 2, 1].PutValue(GetListText(i, 3));
                        worksheet.Cells[i + 2, 1].SetStyle(styleTextCenter);
                    }
                    else
                    {
                        worksheet.Cells[i + 2, 0].PutValue(this.listView.Items[i].SubItems[2].Text);
                        worksheet.Cells[i + 2, 0].SetStyle(styleTextCenter);
                        worksheet.Cells[i + 2, 1].PutValue(this.listView.Items[i].SubItems[3].Text);
                        worksheet.Cells[i + 2, 1].SetStyle(styleTextCenter);
                    }

    这个是获取控件某个属性的值,这里获取的是listview的text值

    这个写法里面可以不用具体指定哪个控件是跨线程的,你可以在这里写很多个invoke,推荐大家使用

     if (this.InvokeRequired)
                            {
                                this.Invoke(new Action<string>(x => { this.lbImpOk.Text = x; }), "导出已停止!");
                            }
                            else
                            {
                                this.lbImpOk.Text = "导出已停止!";
                            }
  • 相关阅读:
    前后台分离--概念相关
    dubbo概述
    memcache
    分布式系统事务
    2018书单索引
    Lucene原理之概念
    java 通用对象排序
    LightOJ1214 Large Division —— 大数求模
    LightOJ1336 Sigma Function —— 质因子分解、约数和为偶数
    LightOJ1245 Harmonic Number (II) —— 规律
  • 原文地址:https://www.cnblogs.com/llcdbk/p/4128065.html
Copyright © 2011-2022 走看看