WinForm中Cross-thread operation not valid错误的解决方法

前一阵子写个小程序,画了一个Form,类名叫MainForm,程序里面还有一个TimerProcessor类,用于对System.Timers.Timer类的实例操作,由于Timer是在新线程中处理OnElapsed事件,而在处理这个事件的方法中,会对MainForm类的控件进行操作,于是,Debug运行时,就出现了如下错误:

从Additional information来看,是因为在非Form的创建线程里访问了Form的控件,因此对控件的存取可能导致控件状态的不一致,所以Visual Studio调试时就抛出了这个异常。但是,如果以非Debug模式运行时,是不会有这个异常的,程序也会正常运行。由于程序不会一直运行在Debug模式,所以可以不管这个异常,但是为了健壮的代码,建议还是对其进行处理。


解决方法:

对需要操作Form中控件的地方,不再直接调用控件的相关设置方法,而是调用Form的Invoke()方法,将对控件进行设置的方法做成一个delegate传递给它,例子如下:

 

复制代码
  
  
// 下面是用于事件处理的方法,该方法和Form的创建线程不是同一
// 个线程,所以直接在该方法中对Form的控件进行操作会出现异常
// 解决方法如该方法所示,其中mainForm代表创建的Form对象
private void OnElapsed( object sender, System.Timers.ElapsedEventArgs e)
{
if (mainForm.InvokeRequired)
{
TrayIconUpdater updater
= new TrayIconUpdater(UpdateTrayIconState);
mainForm.Invoke(updater);
}
else
{
UpdateTrayIconState();
}
}

// 一个在Form的Invoke()方法中要用到的delegate
private delegate void TrayIconUpdater();

// 真正的操作Form中控件的方法
private void UpdateTrayIconState()
{
mainForm.TrayIcon.BalloonTipTitle
= " Application Prompt " ;
mainForm.TrayIcon.BalloonTipText
= " This is a application tip. " ;
mainForm.TrayIcon.ShowBalloonTip(
5000 );
}
复制代码

这样,就算是在Debug模式也不会出现InvalidOperationException了。

参考:http://msdn.microsoft.com/en-us/library/ms171728.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值