Seb*_*Piu 22 c# multithreading winforms threadpool
什么时候抛出InvalidAsynchronousStateException?
我有以下代码:
control.InvokeRequired?control.Invoke(expression):expression();
在一些随机的情况下,我得到InvalidAsynchronousStateException并且我的应用程序挂起,在做了一些阅读之后,似乎是当control创建的线程完成时将抛出此异常.它是否正确?如果是这样的话,情况似乎并非如此,除非某些事情导致我的应用程序崩溃,这种异常只是后果吗?这可能吗?
System.ComponentModel.InvalidAsynchronousStateException:调用方法时发生错误.目标线程不再存在.在System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle的WaitHandle的)在System.Windows.Forms.Control.MarshaledInvoke在System.Windows.Forms.Control.Invoke(控制呼叫者,委派方法,对象[]指定参数时,布尔同步)(委托方法,在Optimus.Desktop.Framework.Spring.Aspects.UIThreadInterceptor.Invoke(IMethodInvocation调用在c)中对象[]在System.Windows.Forms.Control.Invoke(委托方法)参数):\的Optimus \桌面\框架\春\ \方面UIThreadInterceptor.cs:在Spring.Aop.Framework.AbstractMethodInvocation.Proceed()在Spring.Aop.Framework.DynamicProxy.AdvisedProxy.Invoke(对象代理,对象目标,类型目标类型,MethodInfo的targetMethod,MethodInfo的proxyMethod线22,在InheritanceAopProxy_4fda07e8828744839065a154b30915ee.Dispose(布尔处置)在System.ComponentModel.Component.Finalize对象[]指定参数时,IList的拦截器)()
顺便说一句,我已经检查了这个答案并没有澄清我的疑问 - > 函数中的InvalidAsynchronousStateException检查控件是否需要调用
Chr*_*ain 32
通常,当后台线程在UI线程已经退出后尝试调用UI线程时,会发生这种情况.你有没有尝试在他们自己的线程中运行不同的表单,或者你是否从非UI线程中显示()表单,或者在表单显示之前调用()到表单?
背景如下:
1)每个控件(包括表格)都有一个句柄.这用于将控件绑定回底层窗口GDI对象.
2)创建控件本身时通常不会创建控件的句柄.第一次控件是Show()n时创建句柄.
3)当调用控件时,.NET API会尝试使用它的句柄来定位控件的UI线程. 如果表单尚未显示,则CURRENT THREAD(调用线程)将被指定为UI线程.
4)控件的UI线程应该运行一个消息循环来处理该控件(当你这样做时会自动发生,例如,Application.Run(someForm);
5)所以常见的错误是你从一个临时或线程池线程创建一个表单F,Invoke()或BeginInvoke(),它创建了表单的句柄,因此被指定为表单的UI线程.然后后台线程退出,或者被线程池终止,或者只是无法运行消息循环,因为它不知道它已被指定为UI线程.随后,对该表单的任何调用都会因此异常而失败.抛出异常只是因为表单指定的"UI线程"没有运行消息循环.
有关如何发生这种情况的详细分析,请参阅Ivan的帖子:http://www.ikriv.com/en/prog/info/dotnet/MysteriousHang.html