您的位置:首页 > 其它

跨线程访问控件的方法

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

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 = "导出已停止!";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐