您好,欢迎来到汇智旅游网。
搜索
您的当前位置:首页C#,无法访问已释放的对象。对象名:“Form1”。

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

来源:汇智旅游网

这两天初学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线程负载的效果

具体在这个帖子

 

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- hzar.cn 版权所有 赣ICP备2024042791号-5

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务