C#|C# 另类跨线程访问控件异常

C# 另类跨线程操作控件异常
今天写了一小程序,但是却遇到了一个奇怪的问题,我在窗体点击按钮,然后往RichTextbox控件添加文本内容,有时会抛出从不是创建它的线程访问RichTextbox控件,诡异的地方有两处:

  • 按道理,我在界面上点击按钮,然后显示另一个控件的内容,应该不会有跨线程操作控件的异常才对;
  • 就算有异常,但是我在设置RichTextbox控件是添加了InvokeRequired判断并添加了委托,所以就算是跨线程访问此控件,也应该不会抛异常啊,但是却还是抛异常了,真的。
而且这个异常也不是必现,有时有,有时没有,这就真让人头大了。
找啊找,找问题,最后确定是在窗体的构造函数里出了问题。因为我在构造函数中调用了另一个对象的初始化方法,并注册了它的一个事件。问题的关键就在于这个回调事件,如果事件在窗体构造函数执行完成之后再触发的,那程序正常;如果窗体构造函数还未执行完成,异步回调事件先触发了,那么,不好意思,程序必然会出现上述异常。这就可以解释上述的两个疑点了。
那么,为什么呢????
原因还是在于这个异步回调事件,因为我在异步回调的事件中访问了可能会抛异常的RichTextbox控件,来显示一些信息日志,这就导致有可能不是主线程来创建这个控件(大概就是这个意思)。
【C#|C# 另类跨线程访问控件异常】所以,修改下程序,将在构造函数中注册事件、调用初始化方法等操作,放到窗体的_Load事件中去,完事儿,一切正常。

    推荐阅读