好吧,在这里,我再次遇到另一个令人沮丧的问题。 我需要结束我的主进程并重新启动它,但我不能正常地结束应用程序......
我正在将C#应用程序与专有(不是我)数据捕获硬件结合使用,所以它已经很复杂了。
有一种情况是我的软件正在愉快地运行,收集它应该的数据,当我与之接口的硬件突然断电和与我的应用程序的连接时。我的应用程序最终解决了这个问题,我只需要处理旧的连接,然后重新连接到我的硬件。错...
当然,我的对象(带有硬件的接口对象)上的.Dispose()方法终止连接什么都不做,实际上当我尝试运行它时,它就永远锁定到位。显然,在断开发生时,需要设备连接的配置方法永远不会超时。我没有写这个方法,所以我真的不知道。
最后,这是我的问题。让我的应用程序重新启动并再次运行的唯一方法是关闭它并重新打开它。当然,我实际上无法很好地关闭它因为我无法运行Dispose方法。我被迫通过任务管理器结束它的过程。是的,这个过程,而不仅仅是应用程序。如果我关闭它,这个过程将永远存在,我别无选择。
我需要找到一种自动化此过程暗杀的方法,以便我的用户可以实际使用它,但我该怎么办?我知道流程终止是禁忌,但我有什么选择?
我喜欢使用Application.Restart(),但这根本不起作用,我的表格甚至没有关闭,它只是锁定。有没有办法在告诉自己重新启动之前解决这个过程?也许我可以使用批处理文件或其他东西吗? Application.Exit至少将表单从屏幕上移除。
截至目前,我正在从任务管理器中删除它,或者我的用户通过弹出PC上的断路器来杀死它。比任何软件方面都要严厉得多。
答案 0 :(得分:9)
您是否考虑过在另一个流程中隔离有问题的组件?我知道这听起来很复杂,但是如果您创建另一个“应用程序”仅作为您设备的管道存在,您可以使您的主应用程序刚刚开始一个新的那些如果旧的变得反应迟钝。它可以破坏旧的,开始新的,再次“干净”。
它 当然意味着各种进程间的通信,但是隔离一些片状的一般想法通常是有用的。
答案 1 :(得分:1)
假设Dispose()
是问题,并且有一个正确的IDisposable
模式实现,其中终结器调用Dispose()
我认为解决方案可能是调用{{1}防止Dispose被调用。
这很难看,但我可能会工作。
答案 2 :(得分:1)
这个问题应该标题为“当我处理Dispose()
方法时我该怎么办?我无法改变,并且编写时没有考虑一个非常真实且非常令人不安的现实场景? “我的建议是写一个更好的!
最简单的方法是为要处理的对象创建一个包装器,然后如果检测到连接已断开则调用GC.SuppressFinalize(internalConnectionObject);
。这样,如果没有响应,它就不会卡住,但如果它在那里,它将被妥善处理。当您遇到麻烦的组件时,隔离就是您的朋友。