2

这是我的解决方案中的代码的简化版本,它使用了一个非常有问题的第三方库代码:

public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream)
{
    return new GlitchyThirdPartyComponent(stream);
}

对于某些流,构造函数GlitchyThirdPartyComponent完全崩溃并开始消耗大量 CPU 功率和内存,并且在OutOfMemoryException发生之前永远不会退出(在某处闻起来像无限循环)。

我试图找出最安全的调用方式,GetThirdPartyComponent如果它仍在运行,则在某个超时后中止它的执行。

我已经检查了几个可能的解决方案,但似乎没有解决方案适合。有几个原因:

  1. 我无权访问第三方库源代码。所有程序集都被混淆了,所以也没有拆卸
  2. GlitchyThirdPartyComponent不可序列化,因此没有跨应用域或跨进程的解决方案
  3. GlitchyThirdPartyComponent最有可能使用 COM(从它的界面上看),所以Thread.Abort是一个非常不可靠的选择
  4. 虽然可以使用另一个第三方库或向我当前的库供应商寻求错误修复,但这些解决方案需要时间,我的问题应该尽快修复

那么,在这种情况下我应该怎么做呢?这里真的Thread.Abort是最好的解决方案吗?

4

1 回答 1

-1

您可以将调用包装GlitchyThirdPartyComponentTask. 然后有一个超时。像这样的东西

int timeout = 1000;
var task = Task.Run(() => new GlitchyThirdPartyComponent(stream))
if (await Task.WhenAny(task, Task.Delay(timeout)) == task) {
    // task completed within timeout
} else { 
    // timeout logic
}
于 2015-09-25T16:32:50.203 回答