检查控制是否需要调用的函数中的 InvalidAsynchronousStateException
我使用 Stack Overflow 用户提供的这个函数来更新来自 BackgroundWorker
的控件。
static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required thread.
sync.Invoke(action, new object[] { });
}
到目前为止,该功能一直运行良好。我刚刚收到此异常:
这是什么意思以及如何防止它?
I use this function courtesy of a Stack Overflow user to update controls from a BackgroundWorker
.
static void SynchronizedInvoke(ISynchronizeInvoke sync, Action action)
{
// If the invoke is not required, then invoke here and get out.
if (!sync.InvokeRequired)
{
// Execute action.
action();
// Get out.
return;
}
// Marshal to the required thread.
sync.Invoke(action, new object[] { });
}
This function has worked perfectly until now. I just got this exception:
What does this mean and how do I prevent it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这里的问题是
ISynchronizeInvoke
对象绑定到的线程不再存在。例如,如果您生成后台线程并且 UI 线程在后台任务完成之前退出,则可能会发生这种情况。该线程不再存在,因此没有任何东西可以调用,并且您会得到异常。没有什么好的方法可以防止这种情况发生。最好的做法是将
Invoke
调用包装在处理此异常的try / catch
中。The problem here is that the thread to which the
ISynchronizeInvoke
object was bound to no longer exists. This can happen for example if you spawn a background thread and the UI thread exits before the background task completes. The thread no longer exists hence there's nothing to invoke to and you get the exception.There is no good way to prevent this. The best course of action is to wrap the
Invoke
call in atry / catch
which handles this exception.