这两天初学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
本站由北京市万商天勤律师事务所王兴未律师提供法律服务