在做WinFrom开发的时候,经常会遇到跨线程访问控件的问题,即从不是创建控件的线程去访问控件。百度里面搜索,会有各种各样的解决方案。在诸多方案中,我认为没有一个方案是特别简单,而且代码量少的。以前我也傻傻的创建委托(当然也尝试过其它方法),当数量多了以后,发现代码不整洁。今天,我就跟大家分享一下我的方法(至少我没发现别人用这种方法),不正之处,欢迎批评指正。 演示代码 /// <summary>
/// 摘要:
/// 修改Button控件文字(仅供演示)
/// </summary>
private void ChangeBtnText(string Text)
{
Action DoAction = delegate()
{
Btn.Text = Text;
};
if (this.InvokeRequired)
{
ControlExtensions.UIThreadInvoke(this, delegate
{
DoAction();
});
}
else
{
DoAction();
}
}
辅助静态类代码 /// <summary>
/// 摘要:
/// 跨线程访问UI通用组件,在此类外的Try Catch语句不能捕获委托中的错误。
/// </summary>
static class ControlExtensions
{
/// <summary>
/// 同步执行 注:外层Try Catch语句不能捕获Code委托中的错误
/// </summary>
static public void UIThreadInvoke(this Control control, Action Code)
{
try
{
if (control.InvokeRequired)
{
control.Invoke(Code);
return;
}
Code.Invoke();
}
catch
{
/*仅捕获、不处理!*/
}
}
/// <summary>
/// 异步执行 注:外层Try Catch语句不能捕获Code委托中的错误
/// </summary>
static public void UIThreadBeginInvoke(this Control control, Action Code)
{
if (control.InvokeRequired)
{
control.BeginInvoke(Code);
return;
}
Code.Invoke();
}
}
我认为这种写法是一劳永逸的,在解决问题的同时,代码量是最少的而且逻辑清楚代码整洁。关键是用这个方法去重构或者优化以前的代码是最省事的。你只需要将你以前的代码全部放到Action委托中,按这种模式套就可以了。 主要研发方向:Tcp,TcpNat,服务前端,反向连接,大规范并发 QQ交流群:697622527 欢迎交流
|