Monitor.Wait在锁外{} - 工作

时间:2016-12-08 13:34:26

标签: c# .net timeout locking tcpchannel

所以,我正在开发一个使用TcpChannels包含各种客户端和服务器的项目

还有一个特定的操作是冻结服务器 - 使其看起来很慢 - 它不会响应任何远程调用,直到它被解冻。 我用lock,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 个答案:

没有答案