如何检测.net远程方法是否挂起在服务器应用程序端

本文关键字:挂起 是否 服务器 应用程序 方法 程方法 何检测 检测 net | 更新日期: 2023-09-27 18:17:57

由于同步问题,我的。net远程服务器应用程序的远程方法有时会被客户端调用而挂起。这些方法执行一些数据库读/写操作并将结果返回给客户端。它不能正确地处理数据库锁,因此出现挂起问题。不幸的是,我们没有与数据库一起工作的模块(在c++本地代码中实现)的代码,所以我必须找到一个解决方案。我在想,如果服务器应用程序可以得到通知时,任何远程方法挂起,服务器应用程序可以重新启动自己。在我的情况下,重启服务器应用程序是可以接受的,我已经找到了一种方法来做到这一点。那么,有没有什么好方法可以让服务器应用程序知道远程方法何时挂起?

如何检测.net远程方法是否挂起在服务器应用程序端

假设超时足够好,并且不需要解决暂停问题:

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。