C#,无法访问已释放的对象。对象名:“Form1”。

探讨在C#中处理UI界面关闭时异步托管代码的问题,通过使用BeginInvoke替代Invoke来避免资源访问错误,并解释了两者之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这两天初学C#,在写异步托管代码的时候,遇到这么个问题,UI界面已经关闭的同时,DLC指到我之前一句           

    while (!flag)
            {
                this.Invoke(mi); ///////这里报错
                Thread.Sleep(100);
            }

自以为是程序退出的时候由于系统速度过快又去访问了一次mi这个资源,但是点退出的同时系统已经把这个资源释放了,所以报错

然后强制在退出时把flag写为true,程序还是会进这个循环(debug确认了这里为true,但是进入了循环),所以搞不懂了

想了很多办法都无解,最后把其换成

    while (!flag)
            {
                this.BeginInvoke(mi);
                Thread.Sleep(100);
            }

解决问题

看了某篇帖子,别人遇到和我一样的问题,最后反编译发现BeginInvoke在这里和Invoke得区别是BeginInvoke不做异常处理

这样虽然不报错了,但是感觉治标不治本,问题放在这,等以后C#更加熟练了再回头看

 

下班前又看到一个帖子,明白了为什么BeginInvoke不报错,因为BeginInvoke所调用的内容是在UI线程内执行。这样就与我们的异步调用思想违背了。

而且也无法达到以多线程去降低UI线程负载的效果

具体在这个帖子http://zhangbq168.blog.163.com/blog/static/23735305200801754232259/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值