在第三方库代码中中止执行的最安全方法

时间:2015-09-25 16:11:06

标签: c# .net thread-abort

这是我的解决方案中的代码的简化版本,它使用了非常糟糕的第三方库代码:

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

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

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

我已经研究了几种可能的解决方案,但似乎没有解决方案。有几个原因:

  1. 我无法访问第三方库源代码。所有组件都是混淆的,因此不能拆卸
  2. GlitchyThirdPartyComponent不可序列化,因此没有跨域应用或跨流程解决方案
  3. GlitchyThirdPartyComponent最有可能使用COM(通过其界面的外观),因此Thread.Abort是一个非常不可靠的选项
  4. 虽然可以使用其他第三方库或向我当前的图书馆供应商索要修正错误,但这些解决方案需要时间,我的问题应该尽快修复
  5. 那么,在这种情况下我该怎么办? Thread.Abort真的是最好的解决方案吗?

1 个答案:

答案 0 :(得分:-1)

您可以将来电GlitchyThirdPartyComponent打包到Task。然后有一个超时。像这样的东西

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
}