2009-11-10 67 views
1

我写了一个非常复杂的多服务器的IRC僵尸最近也碰到了我已经尽我所能这可以被看作here剥离下来的代码的问题.. 。线程/ LINQ的班级名单问题

我的问题是,当我拨打Disconnect()时,连接无效,而不是断开连接并关闭给定的服务器。它也只是冻结调用类而不是停止Class的正确实例。

任何有关类似问题的帮助或经验将不胜感激。 如果可以,请附上代码。

回答

1

首先,你需要添加一个突破,使这个:

 foreach (Connection connect in connections) 
     { 
      if (searching == true) 
      { 
       if (connect.SERVERID == ServerID) 
       { 
        connect.Stop(); 
        isFound = true; 
        searching = false; 
        connections.Remove(connect); 
       } 
      } 
     } 

变为:

 foreach (Connection connect in connections) 
     { 
      if (connect.SERVERID == ServerID) 
      { 
       connect.Stop(); 
       isFound = true; 
       connections.Remove(connect); 
       break; 
      } 
     } 

因为要修改的集合,而不是使用searching == true条款。效率更高。

接下来,我会改变你的线程运行,看起来像这样:

public void Run() 
{ 
    bool WhileOn = true; 
    NetworkStream stream; 
    string inputLine; 
    StreamReader reader; 
    try 
    { 
     using(TcpClient irc = new TcpClient(SERVER, PORT)) 
     { 
     ... 
     } 
    } 
    catch (ThreadAbortException) 
    { 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.ToString()); 
     Thread.Sleep(5000); 
    } 
} 

这样你的连接会妥善处理。你应该为你的流做类似的工作。

最后,我想对你的线程在Stop功能设定的超时后添加Abort()电话。但是,如果一个TCP套接字被操作系统阻塞,我不知道如果一个中止调用会中断它...

+0

是的一切??并且会解决我的问题吗? – Xavier 2009-11-10 05:57:57

+0

这将失败,因为您正在尝试在枚举时修改集合:connections.Remove(connect)。您必须使用for或while循环并手动迭代才能修改集合,并且您将无法使用IEnumerable接口。 – jrista 2009-11-10 06:04:29

+0

@jrista:不,它应该没问题,因为在删除了它的想法之后,它就会脱离循环;它不会再次迭代。 – 2009-11-10 06:20:50