【问题标题】:How to properly exit a multi-threaded program如何正确退出多线程程序
【发布时间】:2012-10-30 19:31:37
【问题描述】:

我基于 Aforge 制作了一个程序(它是一个视频库)。该库为来自摄像机的下一个视频帧创建自己的刷新事件。到目前为止一切都很好,早期的人帮助我处理了多线程,因此这些 Aforge 线程可以向主程序线程报告,到目前为止一切都很好,效果很好。

代码可以看这里:how to do multithreading when using outside referenced code

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

我需要在关闭程序之前停止另一个线程。 Aforge 中有一个选项可以执行相机停止之类的操作,但这还不够。但是我的代码仍然想写在已经关闭的主窗体上。

有没有办法停止所有线程,或者有什么安全的方法来关闭原始线程?我什至将返回给主程序的报告放在了 try catch 构造中,但效果不佳,在这些情况下停止它的唯一方法是按下 Visual Studio 本身中的停止执行按钮。

【问题讨论】:

    标签: c# multithreading aforge


    【解决方案1】:

    如果我正确理解您的问题,您可能会在您关闭表单时在表单上收到Invoke 电话。我也遇到过这种情况。

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

    【讨论】:

    • 使用 BeginInvoke 代替 Invoke 会更简单(而且可能更正确?)。你真的需要工作线程等待 UI 完成它所做的任何更新吗?使用 BeginInvoke 不会留下孤立的 Invoke 调用,因为它只是一个 PostMessage 调用,其消息不会从消息队列中删除。
    • ...当然 BeginInvoke 有一个不同的(潜在的)问题:如果工作线程运行得太快太久,BeginInvoke 开始丢弃调用(它有一定数量的最大队列大小)。如果工作人员突发操作,或者没有发布太多电话,这不是问题。如果它变成一个,那么你必须找到另一种方法来限制工人。
    • 好吧,因为它是一个 USB 网络摄像头,有自己的帧速率,所以不应该比我的计算快。但它仍然是测试版草案,所以现在我的代码比我的网络摄像头更快.. 但相机可能永远不会比我的代码快,所以本质上我希望我的计算完成。无论如何,我将开始阅读有关 BeginInvoke 的内容,以防我错过某些内容。有点难的话题面团
    • @ jon B 我想这就是我想要的,但是我发现很难理解你写的东西。
    • @user613326 首先使用AppDomain.CurrentDomain.UnhandledException。触发时设置断点或输出调试消息。这将帮助您开始了解如何在程序关闭时处理这些错误。
    猜你喜欢
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多