C#编程中的报错解决System.InvalidOperationException
C#编程中的报错解决System.InvalidOperationException问题场景问题原因解决方案方案一,打破规则方案二,利用委托(Delegate)问题场景在C# Windows GUI编程中,从某个子线程去访问设计器中的某个控件,例如将某个按钮禁用。这样就会触发该异常:System.InvalidOperationException:"线程间操作无效: 从不是创建控件"btn_exp
文章共652字 · 阅读需要大约3分钟
一键AI生成摘要,助你高效阅读
问答
·
C#编程中的报错解决System.InvalidOperationException
问题场景
在C# Windows GUI编程中,从某个子线程去访问设计器中的某个控件,例如将某个按钮禁用。这样就会触发该异常:
System.InvalidOperationException:"线程间操作无效: 从不是创建控件"btn_exp"的线程访问它。"
问题原因
在C# Windows GUI编程中有一个规则,就是只能通过创建控件的线程来访问控件,否则就可能产生不可预料的结果。
解决方案
方案一,打破规则
在构造函数中加入以下语句:
Control.CheckForIllegalCrossThreadCalls = false;
将以上属性设置为假则会取消对非法跨线程调用进行检查,简单粗暴但不保证不出错。
方案二,利用委托(Delegate)
.net为我们提供了Invoke 方法与BeginInvoke方法去调用委托,它们的区别在于前者是线程阻塞的,后者是异步的。因此当委托是一个较为耗时的函数时,Invoke 方法就会导致线程阻塞,表现为用户界面卡顿;而BeginInvoke方法则不会等待委托执行完毕。虽然BeginInvoke方法不会导致线程阻塞,但可以使用EndInvoke方法或者其它类似WaitHandle机制等待异步操作的完成。
BeginInvoke(new MethodInvoker(()=>
{
btn_exp.Enabled = false;
}));
其中,MethodInvoker委托 与EventHandler 委托的区别在于前者是不带参数的:
public delegate void MethodInvoker();
public delegate void EventHandler(object sender, EventArgs e);
更多推荐
已为社区贡献2条内容
所有评论(0)