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