线程/ Linq类列表问题

时间:2009-11-10 05:38:30

标签: c# linq class instance irc

我最近编写了一个非常复杂的多服务器IRC机器人,并遇到了一个问题。 我尽可能地删除了代码,可以查看here

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

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

1 个答案:

答案 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套接字,我不确定中止调用是否会中断它......