最近、非常に複雑なマルチサーバー IRC ボットを作成しましたが、問題が発生しました。ここで表示できるコードをできる限り削除しました。
私の問題はDisconnect()
、指定されたサーバーを切断して閉じるのではなく、接続を呼び出すと無効になることです。また、クラスの正しいインスタンスを停止する代わりに、呼び出し元のクラスをフリーズするだけです。
同様の問題に関するヘルプや経験は大歓迎です。可能であればコードを含めてください。
まず、次のようにブレークを追加する必要があります。
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 によってブロックされている場合、アボート コールによって中断されるかどうかはわかりません...