【问题标题】:Isolate an object that causes application hang [closed]隔离导致应用程序挂起的对象[关闭]
【发布时间】:2014-07-08 20:47:43
【问题描述】:

我在 C# 中使用 VLC 包装器来显示视频流,我的程序有一个视频流列表,它通过调用包装器“playitem”方法对其进行迭代。在未知的时间量之后(和对 playitem 的调用),当调用 playitem 方法时程序挂起。也不例外,据我所知,包装器(或底层代码)正在等待某种资源在它继续之前返回(CPU 使用率保持不变)。

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

【问题讨论】:

  • 有多种策略。 MSDN 文章Cancellation in Managed Threads 值得一读。 Threading in C# by Joseph Albahari 有一个关于取消线程的简短部分,这可能会有所帮助。您还可以使用WinDbg 来确定导致挂起的原因
  • kill the VLC wrapper 是什么意思?它不是线程或进程,只是一个类。所以没有这样的事情。
  • EZI - 我的意思是删除班级持有的所有资源。

标签: c# multithreading winforms vlc


【解决方案1】:

你不会喜欢我要说的话。取消正在进行的操作的唯一可靠方法是使用协作取消技术。 This question 已经涵盖了大多数场景,因此无需在此处重新散列。另外,在这种情况下,他们可能不会帮助你。

问题是您有一个第 3 方 API,无论如何,它可能不提供任何取消支持。如果是这种情况,那么您实际上只有两个选择;只有一个是好的。

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

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

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多