跨线程修改UI控件
1.直接修改, 失败引发异常.
namespace Test
{
public partial class frmVisitControl : Form
{
public frmVisitControl()
{
InitializeComponent();
}
private void SetLabelText()
{
label1.Text = "Hello";
}
private void btnVisitLabel_Click(object sender, EventArgs e)
{
//以下这句将引发InvalidOperationException
Thread th = new Thread(SetLabelText);
th.Start();
}
}
}
2.使用代理, 调用UI控件的invoke方法修改, 成功.
namespace Test
{
public partial class frmVisitControl : Form
{
public frmVisitControl()
{
InitializeComponent();
}
private void SetLabelText()
{
label1.Text = "Hello";
}
delegate void delabc();
public void setText()
{
delabc a = SetLabelText;
label1.Invoke(a, null);
}
private void btnVisitLabel_Click(object sender, EventArgs e)
{
Thread th = new Thread(setText);
th.Start();
}
}
}
3.使用c#2.0提供的匿名(代理)方法,省一点代码.
namespace Test
{
public partial class frmVisitControl : Form
{
public frmVisitControl()
{
InitializeComponent();
}
delegate void delabc();
public void setText()
{
delabc a = delegate() { label1.Text = "Hello"; };
label1.BeginInvoke(a);
}
private void btnVisitLabel_Click(object sender, EventArgs e)
{
//以下这句将引发InvalidOperationException
Thread th = new Thread(setText);
th.Start();
}
}
}
4.使用c#3.5, 4.0中的Action委托, 连代理声明那句都省了.
namespace Test
{
public partial class frmVisitControl : Form
{
public frmVisitControl()
{
InitializeComponent();
}
public void setText()
{
Action a = delegate() { label1.Text = "Hello"; };
label1.BeginInvoke(a);
}
private void btnVisitLabel_Click(object sender, EventArgs e)
{
Thread th = new Thread(setText);
th.Start();
}
}
}
注释:Action委托,用来封装一个方法,该方法不具有参数并且不返回值。 与之对应的是Func委托,它可以有返回值.
邮箱:lzd_ren@hotmail.com
出处:http://www.cnblogs.com/liuzhendong
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步