c# - 无法调用 Invoke 或 BeginInvoke 错误

标签 c# multithreading visual-studio exception

我有一个全局客户都在使用的程序。我检查了我的错误日志,发现有相当多的错误日志似乎抛出了异常(如下所列),但我无法真正弄清楚或跟踪。

我有一些调用,但它们都受 InvokeRequired 保护。 现在我在想,如果我应该使用 if (HandleCreated) 代替。

我什至不确定抛出异常的地点和时间。

在启动时,在 InitializeComponent(); 之后,我有一些任务需要访问某些控件,例如 datagridview。但是,正如我所说,我尝试使用 InvokeRequired 来保护它们。我不确定那是否是导致问题的地方。

我可以执行哪些建议来尝试跟踪这个问题?

无论如何,这是我的异常(exception):

    System.InvalidOperationException: Invoke or BeginInvoke cannot be called on a 

control until the window handle has been created.
   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 ..()
   at ..()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, 

ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

最佳答案

不,如果您使用 InvokeRequired,则不会发生这种情况。只有当 Handle 有效时才会为真。无论如何都非常简单地避免,只是在 Load 事件触发之前不要订阅事件或启动线程。

此崩溃发生在表单关闭 时。你在堆栈跟踪中看不到的东西,因为它发生在另一个线程上。 InvokeRequired + Begin/Invoke() 中存在竞争条件。 InvokeRequired 可能会返回 true,并在一微秒后关闭表单。您的 Begin/Invoke 调用将因此异常而失败。

这不是您可以解决的比赛。在允许窗体关闭之前,您必须确保线程不能再调用 BeginInvoke()。这总是意味着您必须防止关闭表单。背景信息在 this answer 中.

关于c# - 无法调用 Invoke 或 BeginInvoke 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15891319/

相关文章:

visual-studio - 默认情况下将 Visual Studio 设置为面向 Windows Phone 7 模拟器?

c# - 添加一个实例以引用另一个实例中的字段

c++ - std::thread 构造函数(变量数量)

visual-studio - 是否可以将Visual Studio 2010与Visual Studio 2008并排安装?

c++ - QT ntp 并消除差异

python - Chaco 和 PyQt 无法发出信号

c# - VS2005 + 无法选择 Windows 服务作为项目类型

c# - 具有连续数据的二维数组的混排算法

c# - 正则表达式匹配 MongoDB 中字符串中单词的开头

c# - 测量 C# 代码的可测试性