Monitor.Wait external lock {} - РАБОТАЕТ

Итак, я разрабатываю проект, который включает в себя различные клиенты и серверы, используя TcpChannels

И есть одна конкретная операция, которая заключается в замораживании сервера - заставляя его выглядеть медленно - он не будет отвечать на любой удаленный вызов, пока он не будет заморожен. Я делаю это с помощью замков, monitor.wait и monitor.pulse

Проблема в том, что, хотя я явно определил свойство тайм-аута канала, оно не истечет в любом случае на зависшем сервере.

Итак, вот простой пример:

сервер:

    public class Server
    static void Main(string[] args) {
        HelloService myRem = null;

        TcpChannel channel = new TcpChannel(8086);
        ChannelServices.RegisterChannel(channel, true);

        myRem = new HelloService();
        RemotingServices.Marshal(myRem, "HelloService");

        System.Console.WriteLine("<enter> to exit...");
        System.Console.ReadLine();
    }

    public class HelloServer : MarshalByRef {

        private bool freezed = true;

        public string Hello() {
            while (freezed)
                lock (this)
                    Monitor.Wait(this);

            return "Hello World!";
        }
    }

клиент:

public class Client
{
    static void Main()
    {
        IDictionary propBag = new Hashtable();
        propBag["name"] = "tpc";
        propBag["timeout"] = 3000;
        TcpChannel channel = new TcpChannel(propBag, null, null);
        ChannelServices.RegisterChannel(channel, false);
        HelloService obj = (HelloService)Activator.GetObject(typeof(HelloService), "tcp://localhost:8086/HelloService");

        while (true)
        {
            try
            {
                Console.WriteLine(obj.Hello());
            }
            catch (Exception e)
            {
                Console.WriteLine(e.GetType());
                Console.WriteLine("TIMEOUT");
            }
        }
    }
}

На моем компьютере - вызов на стороне клиента никогда не истечет

Пока я на отчаянном предварительном удалении lock (this) заявление

И это начало работать! Прием звонка SocketExceptionНо теперь я могу понять, почему с Monitor.wait всегда должен быть внутри оператора блокировки

Почему это работает на моем компьютере? Я пробовал в других, но у меня не было этой проблемы

РЕДАКТИРОВАТЬ

На самом деле в других компьютерах я не могу получить исключение тайм-аута, но я получаю исключение синхронизации для вызова монитора вне блокировки

0 ответов

Другие вопросы по тегам