最安全的方式中止在第三方库代码执行
问题描述:
这是一个使用一个相当出问题第三方库的代码在我的解决方案的代码的简化版本:最安全的方式中止在第三方库代码执行
public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream)
{
return new GlitchyThirdPartyComponent(stream);
}
对于一些流构造的GlitchyThirdPartyComponent
完全吓坏了,并开始消耗大量的CPU功率和内存,并永远不会退出,直到OutOfMemoryException
发生(闻起来像一个无限循环的地方)。
我试图找出最安全的方法来调用GetThirdPartyComponent
,然后在某个超时后如果它仍在运行中止其执行。
我检查了几种可能的解决方案,但似乎没有解决方案。有几个原因:
- 我没有访问第三方库源代码。所有的组件会被混淆,所以没有拆卸任何
-
GlitchyThirdPartyComponent
不可序列化,所以没有跨AppDomain的或跨流程解决方案 -
GlitchyThirdPartyComponent
最有可能使用COM(通过其inteface的样子),所以Thread.Abort
是一个非常不可靠选项 - 虽然可以使用其他第三方库或问我现在的库供应商的bug修正,这些解决方案需要时间,我的问题应该尽快解决
所以,我要在这做情况? 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
}
+0
OP已经知道这是一个选项。问题是放入'//超时逻辑'部分。 – hvd
你已经消除了所有明显的解决方案,只剩下两个。使用电话。没有人拿起时删除图书馆。 –
您使用的是什么版本的.Net? – Padraic
@Padraic我正在使用.NET 4.5.2 –