当前位置:迪客赚 > 正文

C#编程报错System.InvalidOperationException问题及解决

作者:迪客赚 发布时间:2022-07-24 08:17:57

C#报错System.InvalidOperationException

问题场景

在C# Windows GUI编程中,从某个子线程去访问设计器中的某个控件,例如将某个按钮禁用。这样就会触发该异常:

System.InvalidOperationException:"线程间操作无效: 从不是创建控件"btn_exp"的线程访问它。"

问题原因

在C# Windows GUI编程中有一个规则,就是只能通过创建控件的线程来访问控件,否则就可能产生不可预料的结果。

解决方案

方案一,打破规则

在构造函数中加入以下语句:

1
Control.CheckForIllegalCrossThreadCalls = false;

将以上属性设置为假则会取消对非法跨线程调用进行检查,简单粗暴但不保证不出错。

方案二,利用委托(Delegate)

.net为我们提供了Invoke 方法与BeginInvoke方法去调用委托,它们的区别在于前者是线程阻塞的,后者是异步的。

因此当委托是一个较为耗时的函数时,Invoke 方法就会导致线程阻塞,表现为用户界面卡顿;而BeginInvoke方法则不会等待委托执行完毕。

虽然BeginInvoke方法不会导致线程阻塞,但可以使用EndInvoke方法或者其它类似WaitHandle机制等待异步操作的完成。

1
2
3
4
BeginInvoke(new MethodInvoker(()=>
{
    btn_exp.Enabled = false;
}));

其中,MethodInvoker委托 与EventHandler 委托的区别在于前者是不带参数的:

1
2
public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);


来源:(QQ/微信:313919848),转载请保留出处和链接!如有侵权或出处有误请联系网站客服,我们会第一时间为你处理。

本文链接: https://www.dikezhuan.com/post/91954.html

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录
相关推荐
表情推荐
  • 想你想带你去小树林
  • 想你想打定话给你
  • 想你想给你舌头剪了
  • 想你想要后空翻
  • 想你的夜
  • 想你老戴里都是你
  • 想你都想病了
  • 想像
  • 想出去玩不你没有口罩
  • 想到也没用你想错了
  • 想到你我就呜喔呜喔吼
  • 想到你是个大屌萌妹我的鸡巴就贼兴奋