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

时间:2011-12-13 15:58:01

标签: c# .net remoting

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

2 个答案:

答案 0 :(得分:0)

假设超时足够好而且您不需要解决halting problem

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将在本机调用之外的包装器中,但在远程方法调用内。

当然,在调用本机代码之前使用同步可能是一个更好的主意,以避免首先出现死锁。

答案 1 :(得分:0)

您可以在Remoting连接上设置超时。当时间到了但服务器的方法没有返回时,Remoting会自动抛出RemotingException。