技术开发 频道

.NET Remoting中的线程与网络通信内幕初探


【IT168技术文档】

  今天在翻阅MSDN中关于Remoting的章节时,发现有以下一些记载:
  [使用 .NET Framework 编程 -> .NET 远程处理概述 -> 信道 -> 信道规则]
  远程对象共享信道;远程对象不拥有信道。
  由于每个客户端连接都是在它自己的线程中处理的,因此单个信道可以同时服务于多个客户端。

  照这段话的描述来看,服务端为每一个客户端连接都分配一个独立线程进行处理,那么,Remoting服务端应该是支持并发处理的,不太可能因为线程阻塞造成两个线程都是3秒以后返回。
  于是今天配合SockMon 2005,把Remoting调用中的端口和网络使用情况进行了跟踪,发现我是被最初的那个测试误导了。通过跟踪,也了解了一些Remoting的具体实现细节,我以前困惑的一些问题,比如网络连接何时创建,何时销毁,等等问题,也都有了答案。

  首先我们看一下我的那个测试程序:
  这是远程对象,在i为奇数的时候,线程休眠3秒后返回,否则立即返回。
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 ); } }
  客户端,执行 (new ClientTest ()).Run():
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 ) ); }
  运行这个测试程序,发现有3种情况:
  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两种情况着实让人郁闷,出现测试结果全然不同的原因是什么?服务端到底是怎样处理的?让我们先来看看跟踪数据:
0
相关文章