所以,我正在开发一个使用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
必须始终在锁定语句中
为什么这会在我的电脑上运行?我曾尝试过其他人,但我没有遇到这个问题
编辑
事实上在其他计算机上我无法获得超时异常,但我确实在锁外调用监视器时获得了同步异常