【问题标题】:Exception thrown when closing Application [duplicate]关闭应用程序时抛出异常[重复]
【发布时间】:2017-08-19 17:51:24
【问题描述】:

我已经构建了一个使用Application.Run(new Form) 启动表单的应用程序。在应用程序中有以下线程函数

private void threadTask() {
  while (true) {
    Thread.Sleep(500);
      if (isOn) {
        Invoke((MethodInvoker) delegate { reloadData(tabControl.SelectedIndex); });
        Invoke((MethodInvoker) delegate { onOffButton.BackColor = Color.Lime; });
        Invoke((MethodInvoker) delegate { infoLabel.Visible = false; });
    }
  }
}

当我关闭应用程序时,我得到了这个异常:

抛出异常:“System.InvalidOperationException”在 System.Windows.Forms.dll

在 System.Windows.Forms.Control.Invoke(Delegate method, Object[] args)

我试图通过在表单关闭时调用Application.Exit() 来解决这个问题。该函数被执行,但是,在Application.Exit() 被调用后我仍然得到异常。

有什么办法可以解决这个问题吗?如何检查应用程序是否正在关闭?

【问题讨论】:

  • 在 vs 中调试并检查 wich line throughs 异常。我猜你需要在退出应用程序之前终止线程
  • 这很随机。我会遇到三个 Invoke 行中的任何一个,有时根本不会。
  • 所以就像我说的你必须在退出应用程序之前终止它们
  • 如果没有一个好的minimal reproducible example 能够可靠地重现问题,就无法给出好的、具体的答案。但是,您的问题实际上只是其他重复项的变体,其中您的代码在您开始退出应用程序后不应执行。由您来编写代码来协调想要访问 UI 对象的代码(例如,调用 Invoke())和使这成为不可能的代码(例如,退出应用程序)。

标签: c# multithreading winforms exception


【解决方案1】:

当您的表单在线程仍在运行时关闭时,可能会在表单关闭后和线程中止之前调用其中一个调用。 该调用尝试在表单的 UI 线程(不再运行)的上下文中执行委托。

解决方法:你需要使用一种可以阻止线程运行的机制(在表单的 OnClosing 事件中)。

我建议使用Task(请参阅https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming),您可以使用CancellationToken 取消它。

注意:在Task 中,您需要在调用Invoke 方法之前检查CancellationToken,以确保仅在没有取消请求时才调用它们。

【讨论】:

  • 您可以使用 CancellationToken 取消任何内容。它只会存储取消请求。如果提出了这样的请求,您可以询问令牌。这不仅限于一项任务,您可以随时随地在任何情况下执行此操作
  • @Sir Rufo:我的回答中肯定暗示了您的评论,并在包含的链接中进行了解释...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多