WinForm中Cross-thread operation not valid错误的解决方法
来源:互联网 发布:路由器mac地址怎么查 编辑:程序博客网 时间:2024/05/20 05:06
前一阵子写个小程序,画了一个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
- WinForm中Cross-thread operation not valid错误的解决方法
- c#中对"Cross-thread operation not valid"错误的处理办法
- C#中对"Cross-thread operation not valid"错误的处理办法
- C#中对"Cross-thread operation not valid"错误的权宜之计
- C# 中对"Cross-thread operation not valid"错误的处理办法
- Cross-thread operation not valid
- 解决Cross-thread operation not valid的问题
- 解决Cross-thread operation not valid的问题-zz
- Cross-thread operation not valid (转)
- "current thread not owner"错误的解决方法
- current thread not owner"错误的解决方法
- QtCreator: ptrace operation not permitted错误解决方法
- SVN报Previous operation has not finished; run 'cleanup' if it was interrupted错误的解决方法
- Operation not permitted解决方法
- QSqlQuery::value: not positioned on a valid record 的错误的解决方法
- Operation is not valid due to the current state of object 错误解决
- new Thread 时产生错误:Can't create handler inside thread that has not called Looper.prepare() 的解决方法
- c++11编译错误 Enable multithreading to use std::thread: Operation not permitted
- ArrayList / LinkedList / Vector之间的区别和联系 cnblog
- wampserver进不去phpmyadmin
- 线性表 转载百度百科
- JAVA同步机制synchronized 和百度百科
- Stanford 算法入门 week 5 dijkstra 及其堆优化 stringstream
- WinForm中Cross-thread operation not valid错误的解决方法
- Set改写成Map使用,自己写的一个Map
- windbg 调试线程死锁
- 没事写写
- Java Swing与线程的结合应用(一)
- 监听输入框值的即时变化onpropertychange、oninput兼容IE,Chrome,FF,Opera等
- Java Swing与线程的结合应用(二)
- static块的执行 JAVA深度历险
- Java Swing与线程的结合应用(三)