最近我的winform项目突然遇到一个很奇怪的问题 引发的异常:“System.InvalidOperationException”(位于 System.Windows.Forms.dll 中)

把相关可能的页面都加了try catch,但是依旧找不到异常位置所在。后来同事说断点一步步调试看看,后来终于找到了问题所在

在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。
2023/9/1 10:44:38    在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。

找到问题所在后,我在相关位置加上句柄是否创建的判断,代码如下:

uiDelegate d = new uiDelegate(HandleMessage); if (this.IsHandleCreated) this.BeginInvoke(d, new object[] { e }); else { catch (Exception ex) Logger.Write("Control.MainService_OnServiceMessage 异常 " + ex.Message); Logger.Write(ex.Message);

至此为题得以解决,在此记录以下,以后写代码还是要多注意,要习惯加try catch,定位不到问题时一定要先断点调试。

希望对遇到同样问题的小伙伴有所帮助。

今天在写一个 C# 端口扫描器,运行程序时,出现了以下的错误提示信息: 未处理的“System. Invalid Operation Exception ”类型的 异常 出现在 System. dll 。 其他信息: 断开套接字连接后,只能通过异步方式再次重新连接, 而且只能连接到不同的 EndPoint。在操作完成前,在将不会退出的线程上必须调用 BeginConnect。 截图如下: ... 跨线程操作时,从新建的线程去操作UI线程 的控件时,会 报错 ;第二种:定义一个委托(delegate),委托(delegate)可以将参数与方法传递给控件所在的线程,并由控件所在的线程执行,通过Invoke来调用,这样可以完美解决此类问题。//加载时取消跨线程检查。有两种,第一种:在程序加载时直接修改为允许跨线程操作(相当于屏蔽系统跨线程检查,以免 报错 );但是这不是标准的方法。通过查阅资料得知,正常情况下 .NET 平台为防止出错,不允许其他线程跨线程直接操作UI线程 的控件; Thread objThread = new Thread(new ThreadStart(delegate Control.CheckForIllegalCrossThreadCalls = false;//添加这一句即可 youfunc(); objThread.Start(); 遇到这样一个问题:添加互评信息,断点调试,跳转到BLL层后就直接跳到SqlHelper 弹出错误,说:未将对象设置引用到实例等。还请人帮忙调试代码,调试半天发现抽象工厂并没成功完成反射,奇怪的是:将出现问题的方法 换用反射其他的接口没有问题,后来将有问题的接口和DAL层类都重写了,问题好像解决了。所以添加互评就这么实现了,结果实现查询操作的时候问题重现了,我逐步调试,发现这样一个问题,调试到抽象工 引发 异常 :“System. Invalid Operation Exception ”( 位于 System. Windows . Forms . dll ) 二、原因分析 由上图的错误可知,该错误是在system. windows . forms . dll 发生,奇怪的时,程序可以正常运行,只是在vs的输出窗口报了这个错,并且发现UI没有正常的更新;这时我们就要在更新UI的代码上增加 异常 捕获,看看能否捕获 异常 ,如下:在更新UI的代码上,增加了 异常 捕获,并且弹出 异常 ,发现, 异常 可以被捕获,如下: 所以这里的问题是:我 “System. Invalid Operation Exception ”类型的未经处理的 异常 在 System. Windows . Forms . dll 发生 其他信息: 线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。 多线程这样写 lblDateValue.Invoke(new Action(() => { lblDateValue.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss fffffff"); })); 报错 了。 解决办法: public static class ControlInvoker public static void Invoke(Control ctl, MethodInvoker met... 在关闭程序时,会在下面弹出 异常 this.Invoke((EventHan dl er)delegate {//System. Invalid Operation Exception :“在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke。” DispWnd_picbox.Image = m_image; DispWnd_picbox 以下内容是在本人在 C# 编程 遇到的 异常 ,针对部分 异常 给出了解决办法,但是此解决方法是否真的好用,有待进一步考证,仅供参考。 (1)“System. Invalid Operation Exception ”类型的未经处理的 异常 ,出现在System. Windows . Forms . dll ,其他信息:在创建窗口的句柄前,不能在控件上调用Invoke或                BeginInvoke。 {System. Invalid Operation Exception : 如果分配给命令的连接 位于 本地挂起事务 ,ExecuteReader 要求命令拥有事务。命令的 Transaction 属性尚未初始化。 在 System.Data.OleDb.OleDbConnectionInternal.ValidateTransactio...