如何检测.net远程方法是否挂起在服务器应用程序端
本文关键字:挂起 是否 服务器 应用程序 方法 程方法 何检测 检测 net | 更新日期: 2023-09-27 18:17:57
由于同步问题,我的。net远程服务器应用程序的远程方法有时会被客户端调用而挂起。这些方法执行一些数据库读/写操作并将结果返回给客户端。它不能正确地处理数据库锁,因此出现挂起问题。不幸的是,我们没有与数据库一起工作的模块(在c++本地代码中实现)的代码,所以我必须找到一个解决方案。我在想,如果服务器应用程序可以得到通知时,任何远程方法挂起,服务器应用程序可以重新启动自己。在我的情况下,重启服务器应用程序是可以接受的,我已经找到了一种方法来做到这一点。那么,有没有什么好方法可以让服务器应用程序知道远程方法何时挂起?
假设超时足够好,并且不需要解决暂停问题:
public class TimeoutChecker
{
private static Dictionary<Thread, DateTime> hashTimeouts
= new Dictionary<Thread, DateTime>();
static TimeoutChecker()
{
new Thread(CheckThread).Start();
}
protected static void CheckThread()
{
while (true)
{
try
{
Thread.Sleep(500);
foreach (DateTime t in hashTimeouts.Values)
{
if (DateTime.Now.AddMilliseconds(10 * 1000) < t)
{
//Perform recovery logic.
}
}
}
catch (Exception) { }
}
}
public static void BeforeCall()
{
hashTimeouts.Add(Thread.CurrentThread, DateTime.Now);
}
public static void AfterCall() //be sure to execute in a finally...
{
hashTimeouts.Remove(Thread.CurrentThread);
}
}
这里,BeforeCall和AfterCall将在本机调用之外的包装器中,但在远程方法调用中。
当然,在调用本机代码之前使用同步可能是一个更好的主意,以首先避免死锁。您可以在Remoting连接上设置超时。当时间到了,但是来自服务器的方法没有返回时,Remoting会自动抛出RemotingException。