C#|C# 另类跨线程访问控件异常
C# 另类跨线程操作控件异常
今天写了一小程序,但是却遇到了一个奇怪的问题,我在窗体点击按钮,然后往RichTextbox控件添加文本内容,有时会抛出从不是创建它的线程访问RichTextbox控件,诡异的地方有两处:
- 按道理,我在界面上点击按钮,然后显示另一个控件的内容,应该不会有跨线程操作控件的异常才对;
- 就算有异常,但是我在设置RichTextbox控件是添加了InvokeRequired判断并添加了委托,所以就算是跨线程访问此控件,也应该不会抛异常啊,但是却还是抛异常了,真的。
找啊找,找问题,最后确定是在窗体的构造函数里出了问题。因为我在构造函数中调用了另一个对象的初始化方法,并注册了它的一个事件。问题的关键就在于这个回调事件,如果事件在窗体构造函数执行完成之后再触发的,那程序正常;如果窗体构造函数还未执行完成,异步回调事件先触发了,那么,不好意思,程序必然会出现上述异常。这就可以解释上述的两个疑点了。
那么,为什么呢????
原因还是在于这个异步回调事件,因为我在异步回调的事件中访问了可能会抛异常的RichTextbox控件,来显示一些信息日志,这就导致有可能不是主线程来创建这个控件(大概就是这个意思)。
【C#|C# 另类跨线程访问控件异常】所以,修改下程序,将在构造函数中注册事件、调用初始化方法等操作,放到窗体的_Load事件中去,完事儿,一切正常。
推荐阅读
- 《跨界歌手》:亲情永远比爱情更有泪点
- Linux下面如何查看tomcat已经使用多少线程
- 也许第一步很难,但跨过去就好了
- 多线程NSOperation
- GIS跨界融合赋能多领域技术升级,江淮大地新应用成果喜人
- spring|spring boot中设置异步请求默认使用的线程池
- Android中非UI主线程能不能操作UI()
- Android|Android Kotlin实现AIDL跨进程通信
- CountDownLatch-线程并发的发令枪
- 2018年跨年演讲,拾金。