C# 如何正确退出多线程程序

C# 如何正确退出多线程程序,c#,multithreading,aforge,C#,Multithreading,Aforge,我制作了一个基于Aforge的程序(它是一个视频库)。此库为来自摄影机的下一个视频帧创建自己的刷新事件。到目前为止还不错,早期的人已经帮助我使用多线程,这样这些大线程就可以向主程序线程报告,同样到目前为止还不错,它工作得很好 可以在此处看到代码: 但现在我经常注意到一个新的程序错误。当我想退出程序时,问题就开始了。此时,Aforge线程可能仍处于活动状态。它想写回关闭的主窗体 我需要在关闭程序之前停止另一个线程。在Aforge中有一个选项可以做一些像相机停止这样的事情,但这还不够。但是我的代码仍

我制作了一个基于Aforge的程序(它是一个视频库)。此库为来自摄影机的下一个视频帧创建自己的刷新事件。到目前为止还不错,早期的人已经帮助我使用多线程,这样这些大线程就可以向主程序线程报告,同样到目前为止还不错,它工作得很好

可以在此处看到代码:

但现在我经常注意到一个新的程序错误。当我想退出程序时,问题就开始了。此时,Aforge线程可能仍处于活动状态。它想写回关闭的主窗体

我需要在关闭程序之前停止另一个线程。在Aforge中有一个选项可以做一些像相机停止这样的事情,但这还不够。但是我的代码仍然希望在已经关闭的主窗体上编写


是否有一种方法可以停止所有线程,或者有某种安全的方法可以关闭原始线程?我甚至在try-catch结构中设置了对主程序的后向报告,但它没有很好地工作,在这种情况下停止它的唯一方法是按下Visual Studio本身中的停止执行按钮。

如果我正确理解您的问题,当您关闭表单时,表单上可能会发生
Invoke
调用。我也经历过这种情况


我所做的是在我开始关闭表单时设置一个“shutdown”变量,然后使用
AppDomain.CurrentDomain.UnhandledException
监视
InvalidOperationException
(或您得到的任何信息),如果设置了shutdown,则忽略它。

这样会更简单(可能更正确?)使用BeginInvoke而不是Invoke。您真的需要工作线程等待UI完成它所做的任何更新吗?使用BeginInvoke不会导致孤立调用,因为这只是一个PostMessage调用,其消息不会从消息队列中删除……当然,BeginInvoke有一个不同的(潜在的)问题:如果工作线程速度太快,持续时间太长,BeginInvoke会开始丢弃调用(它有一些最大队列大小)。如果工作人员突发操作,或者没有发出过多的电话,这不是问题。如果它变成了一个,那么你必须找到另一种方法来限制工作。因为它是一个usb网络摄像头,有自己的帧速率,这不应该比我的计算速度快。但它仍然是测试版的草稿,所以现在我的代码比我的网络摄像头快。。但是相机可能永远不会比我的代码快,所以本质上我希望我的计算能完成。无论如何,我会开始读关于BeginInvoke的书,以防我错过了什么。这是一个有点难的话题@jon B我想这就是我想要的,但是我发现很难理解你写的东西。@user613326从使用
AppDomain.CurrentDomain.UnhandledException
开始。在触发时设置断点或输出调试消息。这将帮助您开始了解在程序关闭时如何处理这些错误。