gpt4 book ai didi

c# - 理解 InvalidAsynchronousStateException 的发生

转载 作者:IT王子 更新时间:2023-10-29 04:30:17 26 4
gpt4 key购买 nike

InvalidAsynchronousStateException 何时抛出?

我有以下代码:

control.InvokeRequired ? control.Invoke(expression) : expression();

在某些随机情况下,我得到 InvalidAsynchronousStateException 并且我的应用程序挂起,经过一些阅读后,似乎是当创建 control 的线程完成时将抛出此异常。这个对吗?如果是这样,情况似乎并非如此,除非有什么东西让我的应用程序崩溃并且这个异常只是一个结果?这可能吗?


System.ComponentModel.InvalidAsynchronousStateException: An error occurred invoking the method. The destination thread no longer exists. at System.Windows.Forms.Control.WaitForWaitHandle(WaitHandle waitHandle) at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) at System.Windows.Forms.Control.Invoke(Delegate method) at Optimus.Desktop.Framework.Spring.Aspects.UIThreadInterceptor.Invoke(IMethodInvocation invocation) in c:\Optimus\Desktop\Framework\Spring\Aspects\UIThreadInterceptor.cs:line 22 at Spring.Aop.Framework.AbstractMethodInvocation.Proceed() at Spring.Aop.Framework.DynamicProxy.AdvisedProxy.Invoke(Object proxy, Object target, Type targetType, MethodInfo targetMethod, MethodInfo proxyMethod, Object[] args, IList interceptors) at InheritanceAopProxy_4fda07e8828744839065a154b30915ee.Dispose(Boolean disposing) at System.ComponentModel.Component.Finalize()


顺便说一句,我已经检查了这个答案,但没有澄清我的疑问 -> InvalidAsynchronousStateException in function that checks if invoke is required for control

最佳答案

通常当后台线程在 UI 线程已经退出后试图调用 UI 线程时会发生这种情况。您是否有机会尝试在各自的线程中分别运行不同的表单,或者您是否从非 UI 线程显示 () 表单,或在表单显示之前调用 () 到表单?

背景如下:

1) 每个控件(包括窗体)都有一个句柄。这用于将控件绑定(bind)回底层 Windows 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

关于c# - 理解 InvalidAsynchronousStateException 的发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6360876/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com