TcpChannel停止监听后,再重新打开监听为何出现下列错误:  未处理的“System.Threading.ThreadStateException”类型的异常出现在 mscorlib.dll 中。其他信息: 线程正在运行或被终止;它无法重新启动   代码如下:
   //***************单击“运行”按钮***************
private void cmdRun_Click(object sender, System.EventArgs e)
{
   IChannel[] channels=ChannelServices.RegisteredChannels;
   if  (channels.Length==0)
        {
RemotingConfiguration.Configure(@"..\..\MWCServer.config" 
        }
   else
        {
foreach(IChannel eachChannel in channels)
{
    if(eachChannel.ChannelName=="tcp")
{
TcpChannel tcpChannel=(TcpChannel)eachChannel;
tcpChannel.StartListening(null); }
}
        }
}//***************单击“停止”按钮***************
private void cmdStop_Click(object sender, System.EventArgs e)
{
  IChannel[] channels=ChannelServices.RegisteredChannels;
  foreach(IChannel eachChannel in channels)
  {
    if(eachChannel.ChannelName=="tcp")
     {
       TcpChannel tcpChannel=(TcpChannel)eachChannel;
       tcpChannel.StopListening(null);
      }
  }
}

解决方案 »

  1.   

    what happens if you doprivate void cmdStop_Click(object sender, System.EventArgs e)
    {
      IChannel[] channels=ChannelServices.RegisteredChannels;
      foreach(IChannel eachChannel in channels)
      {
        if(eachChannel.ChannelName=="tcp")
         {
           TcpChannel tcpChannel=(TcpChannel)eachChannel;
           tcpChannel.StopListening(null);
           ChannelServices.UnregisterChannel(tcpChannel);
          }
      }
    }
      

  2.   

    请尝试使用ChannelServices.UnregisterChannel和ChannelServices.RegisterChannel方法!不要去调用StopListening和StartListening方法!
      

  3.   

    执行tcpChannel.StopListening(null);后,在调试环境中确实看到有一线程退出程序,那么注册多个通道,是不是启动多个线程那?
      

  4.   

    嗯,直接注销掉Channel,够绝!
      

  5.   

    >>> 注册一个通道是不是启动一个线程
    Remoting的通讯服务也是由Socket提供的,而且是Managed Socket
    tcpChannel.StartListening和tcpChannel.StopListening调用,实际上是在用于监听的Socket上调用了Listen和Close方法而这里为了防止阻塞当前线程,用于监听的Socket必须在别的线程上。这样不是直接使用了多线程,就是使用了异步。而异步也是由多线程实现的