隔离导致应用程序挂起的对象

时间:2014-07-08 20:47:44

标签: c# multithreading winforms vlc

我在C#中使用VLC包装器来显示视频流,我的程序有一个视频流列表,它通过调用包装器来播放包含播放器"播放项目"方法。在未知的时间(并调用playitem)后,程序会在调用playitem方法时挂起。没有异常,从我可以告诉包装器(或底层代码)等待某种资源在它继续进行之前返回(CPU使用率保持不变)。

我想弄清楚这个方法花了太长时间才能返回然后退出函数调用,这样我就可以删除包装器使用的任何资源并重新加载所有内容,所有这些都不会导致整个进程被终止。这可能吗?有没有办法在某种超时时包装函数调用?

1 个答案:

答案 0 :(得分:2)

你不会喜欢我要说的话。取消正在进行的操作的唯一可靠方法是使用合作取消技术。 This question已经涵盖了大多数情况,因此无需在此重复使用它们。另外,无论如何,他们可能无法帮助你。

问题是你有第三方API,大概无论如何都不提供任何取消支持。如果是这种情况那么你真的只有两个选择;只有一个是好的。

选项1:如果API是受管理的(在CLR中运行),那么您可以将所有调用放在另一个线程中,然后如果线程行为不当则中止该线程。这是一个坏主意,因为中止线程可能导致内存损坏。它可能无法运行,因为CLR试图在代码中的潜在安全点注入中止。如果API正在执行非托管代码,则CLR可能会延迟中止,直到执行返回到托管领域,如果呼叫挂起,则不会发生。

选项2:更好的选择是重新设计应用程序,以便运行两个进程。一个是应用程序的主要部分,另一个将充当第三方API调用的代理。然后,您将使用WCF(或其他)来回传递消息。如果API行为异常并挂起,则主进程将终止子进程并启动新进程。主要过程将不受内存损坏的影响,因为API调用在它们自己的进程中是孤立的。重构代码以正确设置它会是很多工作,但它是实际上可靠的少数选项之一。

相关问题