【IT168技术文档】
今天在翻阅MSDN中关于Remoting的章节时,发现有以下一些记载:
[使用 .NET Framework 编程 -> .NET 远程处理概述 -> 信道 -> 信道规则]
远程对象共享信道;远程对象不拥有信道。
由于每个客户端连接都是在它自己的线程中处理的,因此单个信道可以同时服务于多个客户端。
照这段话的描述来看,服务端为每一个客户端连接都分配一个独立线程进行处理,那么,Remoting服务端应该是支持并发处理的,不太可能因为线程阻塞造成两个线程都是3秒以后返回。
于是今天配合SockMon 2005,把Remoting调用中的端口和网络使用情况进行了跟踪,发现我是被最初的那个测试误导了。通过跟踪,也了解了一些Remoting的具体实现细节,我以前困惑的一些问题,比如网络连接何时创建,何时销毁,等等问题,也都有了答案。
首先我们看一下我的那个测试程序:
这是远程对象,在i为奇数的时候,线程休眠3秒后返回,否则立即返回。
客户端,执行 (new ClientTest ()).Run():public class TestClass : MarshalByRefObject public string Call(int i) >{ long t1 = DateTime.Now.Ticks; if ( i % 2 == 1 ) System.Threading.Thread.Sleep( 3000 ); long t2 = DateTime.Now.Ticks; return string.Format( "Hello [I={0},T={1}]", i, t2 - t1 ); } }
运行这个测试程序,发现有3种情况:class ClientTest >{ public void Run() >{ ChannelServices.RegisterChannel( new TcpClientChannel() ); for ( int i = 0; i < 2; i++ ) >{ Thread t = new Thread( new ThreadStart( Test ) ); t.Start(); } } int i = 0; private void Test() >{ int t = i++; TestClass tc = (TestClass) Activator.GetObject( typeof( TestClass ), "tcp://localhost:8086/Test" ); Console.WriteLine( tc.Call( t ) ); }
1、正常运行后两个线程几乎都是在3秒以后,返回:
Hello [I=0, T=0] Hello [I=1, T=30000384]
2、用SockMon监视网络的时候,再运行测试程序,
I=0的消息马上返回,I=1的是3秒以后返回。这个结果应该是正常的。
3、用RemotingConfiguration.Configure( "Client.exe.config" ); 替换掉
ChannelServices.RegisterChannel( new TcpClientChannel() );
也就是说用配置文件注册通道的时候,
不管SockMon有没有开启,测试程序的结果也都是正常的,同第2种情况。
这第2和第3两种情况着实让人郁闷,出现测试结果全然不同的原因是什么?服务端到底是怎样处理的?让我们先来看看跟踪数据: