1
我写了一个非常复杂的多服务器的IRC僵尸最近也碰到了我已经尽我所能这可以被看作here剥离下来的代码的问题.. 。线程/ LINQ的班级名单问题
我的问题是,当我拨打Disconnect()
时,连接无效,而不是断开连接并关闭给定的服务器。它也只是冻结调用类而不是停止Class的正确实例。
任何有关类似问题的帮助或经验将不胜感激。 如果可以,请附上代码。
我写了一个非常复杂的多服务器的IRC僵尸最近也碰到了我已经尽我所能这可以被看作here剥离下来的代码的问题.. 。线程/ LINQ的班级名单问题
我的问题是,当我拨打Disconnect()
时,连接无效,而不是断开连接并关闭给定的服务器。它也只是冻结调用类而不是停止Class的正确实例。
任何有关类似问题的帮助或经验将不胜感激。 如果可以,请附上代码。
首先,你需要添加一个突破,使这个:
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套接字被操作系统阻塞,我不知道如果一个中止调用会中断它...
是的一切??并且会解决我的问题吗? – Xavier 2009-11-10 05:57:57
这将失败,因为您正在尝试在枚举时修改集合:connections.Remove(connect)。您必须使用for或while循环并手动迭代才能修改集合,并且您将无法使用IEnumerable接口。 – jrista 2009-11-10 06:04:29
@jrista:不,它应该没问题,因为在删除了它的想法之后,它就会脱离循环;它不会再次迭代。 – 2009-11-10 06:20:50