gpt4 book ai didi

c# - 如何处理第三方代码中的死锁

转载 作者:行者123 更新时间:2023-12-04 02:26:50 25 4
gpt4 key购买 nike

我们有第三方方法 Foo有时会因未知原因陷入僵局。
我们正在执行一个单线程的 tcp-server 并且每 30 秒调用一次这个方法来检查外部系统是否可用。
为了缓解第三方代码中的死锁问题,我们将 ping 调用放在 Task.Run 中。使服务器不会死锁。
喜欢

async Task<bool> WrappedFoo()
{
var timeout = 10000;

var task = Task.Run(() => ThirdPartyCode.Foo());
var delay = Task.Delay(timeout);

if (delay == await Task.WhenAny(delay, task ))
{
return false;
}
else
{
return await task ;
}
}
但这(在我们看来)有可能使空闲线程的应用程序挨饿。因为如果一通电话 ThirdPartyCode.Foo死锁线程永远不会从这个死锁中恢复,如果这种情况经常发生,我们可能会耗尽资源。
是否有一种一般方法应该如何处理死锁的第三方代码?
一个 CancellationToken将不起作用,因为第三方 API 不提供任何取消选项。
更新:
手头的方法来自SAP提供的SAPNCO.dll,用于建立和测试到sap-system的rfc-connections,因此该方法不是简单的网络ping。我重命名了问题中的方法以避免进一步的误解

最佳答案

Is there a general approach how one should handle deadlocking third-party code?


是的,但这并不容易或简单。
行为不端代码的问题在于,它不仅会泄漏资源(例如线程),而且还会无限期地保留重要资源(例如,某些内部“句柄”或“锁”)。
强制回收线程和其他资源的唯一方法是结束进程。操作系统用于清理行为不端的进程,并且非常擅长。所以,这里的解决方案是启动一个子进程来进行 API 调用。您的主应用程序可以通过重定向 stdin/stdout 与其子进程通信,如果子进程超时,主应用程序可以终止它并重新启动它。
不幸的是,这是取消不可取消代码的唯一可靠方法。

关于c# - 如何处理第三方代码中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66867397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com