美文网首页
C# 另类跨线程访问控件异常

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

作者: AnuoF | 来源:发表于2019-07-25 16:21 被阅读0次

C# 另类跨线程操作控件异常

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

  • 按道理,我在界面上点击按钮,然后显示另一个控件的内容,应该不会有跨线程操作控件的异常才对;
  • 就算有异常,但是我在设置RichTextbox控件是添加了InvokeRequired判断并添加了委托,所以就算是跨线程访问此控件,也应该不会抛异常啊,但是却还是抛异常了,真的。

而且这个异常也不是必现,有时有,有时没有,这就真让人头大了。

找啊找,找问题,最后确定是在窗体的构造函数里出了问题。因为我在构造函数中调用了另一个对象的初始化方法,并注册了它的一个事件。问题的关键就在于这个回调事件,如果事件在窗体构造函数执行完成之后再触发的,那程序正常;如果窗体构造函数还未执行完成,异步回调事件先触发了,那么,不好意思,程序必然会出现上述异常。这就可以解释上述的两个疑点了。

那么,为什么呢????

原因还是在于这个异步回调事件,因为我在异步回调的事件中访问了可能会抛异常的RichTextbox控件,来显示一些信息日志,这就导致有可能不是主线程来创建这个控件(大概就是这个意思)。

所以,修改下程序,将在构造函数中注册事件、调用初始化方法等操作,放到窗体的_Load事件中去,完事儿,一切正常。

相关文章

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

    C# 另类跨线程操作控件异常 今天写了一小程序,但是却遇到了一个奇怪的问题,我在窗体点击按钮,然后往RichTex...

  • C#跨线程访问控件

    1、跨线程检查设置为false 2、使用Invoke或者BeginInvoke方法, async关键字 3、使用I...

  • C# WinForm 跨线程访问控件

    问题出现: 在WinForm 处理多线程访问主线程的控件时候,就会出现如图所示的错误对话框: ** 解决方案:**...

  • C#中跨线程更新UI的方法总结

    在C#编程环境中,不允许在工作线程中直接对主线程(UI线程)中的控件进行更新操作。因此,稍微复杂一点的程序,跨线程...

  • C#多线程控件操作

    1、问题来由 C#多线程操作的时候会发生共享违例,当然可以使用铺货异常的方法禁止掉,但这可能导致控件显示异常。 当...

  • Android为什么不允许在子线程中访问UI

    首先,UI控件不是线程安全的,如果多线程并发访问UI控件可能会出现不可预期的状态那为什么系统不对UI控件的访问加上...

  • 消息机制

    Handler Android 有一条非常重要的开发规范限制:不能在子线程访问UI控件,否则程序异常。所以经常通过...

  • 线程间通信:Handler机制

    什么是Handler机制 Android系统不允许子线程访问UI组件(子线程访问主线程),主要是因为UI控件是非线...

  • UIWebView/WKWebView存在控件跨域访问漏洞(CN

    UIWebView/WKWebView存在控件跨域访问漏洞(CNNVD-201801-515) 漏洞描述 ​ ...

  • Android个人对Handler机制的理解

    一.系统为什么不允许子线程访问UI线程: 这是因为UI线程里面的控件都是非线程安全的,如果在多线程并发访问可能会导...

网友评论

      本文标题:C# 另类跨线程访问控件异常

      本文链接:https://www.haomeiwen.com/subject/jsghrctx.html