在第三方库代码中中止执行的最安全方法
本文关键字:安全 方法 执行 第三方 代码 | 更新日期: 2023-09-27 18:14:44
在我的解决方案中有一个代码的简化版本,它使用了一个非常容易出错的第三方库代码:
public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream)
{
return new GlitchyThirdPartyComponent(stream);
}
对于某些流,GlitchyThirdPartyComponent
的构造函数完全崩溃,开始消耗大量的CPU功率和内存,直到OutOfMemoryException
出现才退出(闻起来像某个无限循环)。
我正试图找出最安全的方法来调用GetThirdPartyComponent
,然后在一定超时后中止其执行,如果它仍在运行。
我已经研究了几个可能的解决方案,但似乎没有合适的解决方案。有几个原因:
- 我无法访问第三方库源代码。所有的程序集都是混淆的,所以没有反汇编
-
GlitchyThirdPartyComponent
是不可序列化的,所以没有跨应用域或跨进程的解决方案 -
GlitchyThirdPartyComponent
最有可能使用COM(通过其接口的外观),所以Thread.Abort
是一个非常不可靠的选项 - 虽然可以使用另一个第三方库或要求我当前的库供应商修复错误,但这些解决方案需要时间,我的问题应该尽快修复
那么,在这种情况下我该怎么做呢?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
}