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

本文关键字:安全 方法 执行 第三方 代码 | 更新日期: 2023-09-27 18:14:44

在我的解决方案中有一个代码的简化版本,它使用了一个非常容易出错的第三方库代码:

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

对于某些流,GlitchyThirdPartyComponent的构造函数完全崩溃,开始消耗大量的CPU功率和内存,直到OutOfMemoryException出现才退出(闻起来像某个无限循环)。

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

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

  1. 我无法访问第三方库源代码。所有的程序集都是混淆的,所以没有反汇编
  2. GlitchyThirdPartyComponent是不可序列化的,所以没有跨应用域或跨进程的解决方案
  3. GlitchyThirdPartyComponent最有可能使用COM(通过其接口的外观),所以Thread.Abort是一个非常不可靠的选项
  4. 虽然可以使用另一个第三方库或要求我当前的库供应商修复错误,但这些解决方案需要时间,我的问题应该尽快修复

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

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

您可以将对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
}