跨线程访问控件的方法
2014-11-28 11:17
162 查看
主窗体创建的控件相当于主线程管理,在分线程使用的时候会产生跨线程访问的问题,这时需要如下判断写法,即可解决
但是据大神说,微软推荐的方式是使用委托的方式,写法如下,
这个是获取控件某个属性的值,这里获取的是listview的text值
这个写法里面可以不用具体指定哪个控件是跨线程的,你可以在这里写很多个invoke,推荐大家使用
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 = "导出已停止!"; }
相关文章推荐
- 线程间操作无效: 从不是创建控件“”的线程访问它的解决方法
- “线程间操作无效:从不是创建控件“XX”的线程访问它”的解决方法
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法
- 线程访问窗体的控件方法
- C# 线程操作 出现“从不是创建控件lstUser的线程访问它”错误的解决方法
- 线程间操作无效: 从不是创建控件“...”的线程访问它(解决方法)
- 线程间操作无效 从不是创建控件 的线程访问它。——解决方法
- VS2005中更新其他线程访问界面线程控件的方法
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- [转]线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 小结“线程间操作无效: 从不是创建控件的线程访问它” 错误的解决方法
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法!
- “从不是创建XX控件的线程访问它”错误的解决方法!
- C# 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~
- VS2005的“从不是创建控件的线程访问它”的解决方法
- C# .NET 在一个线程中访问另一个线程的控件 方法汇总 (转载)