1

最近、非常に複雑なマルチサーバー IRC ボットを作成しましたが、問題が発生しました。ここで表示できるコードをできる限り削除しました。

私の問題はDisconnect()、指定されたサーバーを切断して閉じるのではなく、接続を呼び出すと無効になることです。また、クラスの正しいインスタンスを停止する代わりに、呼び出し元のクラスをフリーズするだけです。

同様の問題に関するヘルプや経験は大歓迎です。可能であればコードを含めてください。

4

1 に答える 1

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 ソケットが OS によってブロックされている場合、アボート コールによって中断されるかどうかはわかりません...

于 2009-11-10T05:45:55.820 に答える