2017-08-19 71 views
-1

我已经构建了一个应用程序,使用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(委托方法,对象[]参数)

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

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

+1

在vs中调试并检查至极线是否通过异常。我想你需要终止线程退出应用程序 – lvl4fi4

+0

这是非常随机的。我发生在三条Invoke行中的任何一行,有时根本就没有。 –

+0

所以就像我说你必须终止他们退出应用程序 – lvl4fi4

回答

2

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

解决方案:您需要使用一种可以阻止线程运行的机制(在窗体的OnClosing事件中)。

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

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

+2

你可以用CancellationToken取消任何东西。它只会存储取消请求。如果有这样的请求,你可以询问令牌。这不仅限于任务,你可以在任何情况下做到这一点 –

+0

@Sir Rufo:你的评论当然是隐含在我的回答中,并在包含的链接中加以解释...... –

相关问题