Как определить, что метод удаленного взаимодействия .net зависает на стороне приложения сервера? - PullRequest
0 голосов
/ 13 декабря 2011

Метод удаленного взаимодействия моего приложения-сервера удаленного взаимодействия .net иногда зависает, когда клиенты вызывают его из-за проблем с синхронизацией.Эти методы выполняют некоторые операции чтения / записи в базу данных и возвращают результаты клиентам.Он не обрабатывает блокировку базы данных должным образом, поэтому возникает проблема зависания.К сожалению, у нас нет кода модуля (реализованного в собственном коде c ++), который работает с базой данных, поэтому я должен найти обходной путь.Я думаю, что если серверное приложение может получить информацию, когда какой-либо из методов удаленного взаимодействия зависнет, серверное приложение может перезапустить себя.В моем случае перезапуск серверного приложения является приемлемым, и я уже нашел подход для этого.Так есть ли хорошие способы, чтобы серверное приложение узнало, когда метод удаленного взаимодействия зависает?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

Вы можете установить тайм-аут на вашем удаленном соединении.Когда время истекло, но метод с сервера не вернулся, Remoting автоматически создает исключение RemotingException.

0 голосов
/ 13 декабря 2011

Если время ожидания достаточно, и вам не нужно решать проблему остановки :

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 будут находиться в оболочке вне собственных вызовов, но внутри удаленных вызовов методов.

Конечно, гораздо лучше использовать синхронизацию перед вызовом нативного кода, чтобы в первую очередь избежать блокировок.

...