这是我的解决方案中的代码的简化版本,它使用了非常糟糕的第三方库代码:
public GlitchyThirdPartyComponent GetThirdPartyComponent(Stream stream)
{
return new GlitchyThirdPartyComponent(stream);
}
对于某些流,GlitchyThirdPartyComponent
的构造函数完全吓坏了并开始消耗大量的CPU能力和内存,并且在OutOfMemoryException
发生之前永远不会退出(在某处闻起来像无限循环)。
我试图找出最安全的方法来调用GetThirdPartyComponent
,然后在某个超时后中止执行,如果它仍然在运行。
我已经研究了几种可能的解决方案,但似乎没有解决方案。有几个原因:
GlitchyThirdPartyComponent
不可序列化,因此没有跨域应用或跨流程解决方案GlitchyThirdPartyComponent
最有可能使用COM(通过其界面的外观),因此Thread.Abort
是一个非常不可靠的选项那么,在这种情况下我该怎么办? Thread.Abort
真的是最好的解决方案吗?
答案 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
}