我最近编写了一个非常复杂的多服务器IRC机器人,并遇到了一个问题。 我尽可能地删除了代码,可以查看here。
我的问题是,当我调用Disconnect()
时,连接无效而不是断开连接并关闭给定服务器。它也只是冻结调用类而不是停止正确的类实例。
对于类似问题的任何帮助或经验将不胜感激。 如果可以,请附上代码。
答案 0 :(得分: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);
}
}
以便妥善处理您的连接。你应该为你的流做类似的事情。
最后,我会在设置超时后在Abort()
函数中为您的线程添加Stop
调用。但是,如果操作系统阻止TCP套接字,我不确定中止调用是否会中断它......