最近我的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...