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
всегда должен быть внутри оператора блокировки
Почему это работает на моем компьютере? Я пробовал в других, но у меня не было этой проблемы
РЕДАКТИРОВАТЬ
На самом деле в других компьютерах я не могу получить исключение тайм-аута, но я получаю исключение синхронизации для вызова монитора вне блокировки