隔离导致应用程序挂起的对象
本文关键字:对象 挂起 应用程序 隔离 | 更新日期: 2023-09-27 18:11:58
我在c#中使用VLC包装器来显示视频流,我的程序有一个视频流列表,它通过调用包装器"playitem"方法迭代。在一段未知的时间(以及对playitem的调用)之后,当调用playitem方法时,程序会挂起。没有例外,从我可以看出,包装器(或底层代码)在继续之前等待某种资源返回(CPU使用率保持不变)。
我想弄清楚这个方法何时需要太长时间才能返回,然后退出函数调用,这样我就可以放弃包装器正在使用的任何资源并重新加载所有内容,而不会杀死整个进程。这可能吗?是否有一种方法来包装一个函数调用在某种超时?
你不会喜欢我接下来要说的话。取消正在进行的操作的唯一可靠方法是使用协作取消技术。这个问题已经涵盖了大多数情况,所以没有必要在这里重复它们。另外,在这种情况下,他们可能不会帮助你。
问题是你有一个第三方API,无论如何,大概不提供任何取消支持。如果是这样的话,那么你只有两个选择;只有一个是好的。
选项1:如果API是托管的(在CLR中运行),那么你可以把所有对它的调用放在另一个线程中,然后在它行为不当时中止线程。这是一个坏主意,因为中止线程可能导致内存损坏。它可能无论如何都无法工作,因为CLR试图在代码中的潜在安全点注入中止。如果API正在执行非托管代码,那么CLR可能会延迟中止,直到执行返回到托管领域,如果调用挂起,则不会发生这种情况。
选项2:一个更好的选择是重新设计应用程序,以便有两个进程在运行。一个将是应用程序的主要部分,另一个将充当第三方API调用的代理。然后,您将使用WCF(或其他)来来回传递消息。如果API行为不正常并挂起,那么主进程将杀死子进程并启动一个新进程。主进程将不受内存损坏的影响,因为API调用在它们自己的进程中是隔离的。重构代码以正确设置这将是一项大量的工作,但这是少数几个真正可靠的选项之一。