【问题标题】:How to detect if the .net remoting method hangs on the server app side?如何检测 .net 远程处理方法是否在服务器应用程序端挂起?
【发布时间】:2011-12-13 15:58:00
【问题描述】:

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

【问题讨论】:

  • 您可以在单独的线程中异步执行该方法...如果执行时间过长,您“知道”它会挂起...
  • 您可能会停止使用远程处理并开始使用 WCF 等现代技术

标签: c# .net remoting


【解决方案1】:

假设超时就足够了,你不需要解决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 将在本地调用之外的包装器中,但在远程方法调用内部。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果服务器没有返回(在死锁甚至无限休眠的情况下),客户端可能会得到RemotingException。那么在服务器端呢?我不确定服务器应用程序是否也会收到 RemotingException。
    • 对。来自客户端的每个远程调用都在从内置 .NET 线程池中获取的单独线程上执行。如果该线程出现死锁或无限休眠,它将永远不会返回。您应该考虑在服务器方法中重构代码。 @ebyrob 对将调用同步到本机 C++ 库有一个很好的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多