我有以下幾點:線程和套接字
ThreadStart startThread =
delegate
{
mySocket.StartListen();
};
mySocket現在循環在聽()的時候我:
new Thread(startThread).Start();
這裏是StartListen:
public void StartListen()
{
Object locker = new Object();
// Lock resources
lock (locker)
{
S = new System.Net.Sockets.Socket(System.Net.Sockets.AddressFamily.InterNetwork,
System.Net.Sockets.SocketType.Stream,
System.Net.Sockets.ProtocolType.Tcp);
S.Blocking = false;
try
{
S.Bind(serverEP);
S.Listen(1000);
isListening = true;
/*
* While statement not required here because AcceptConnection()
* method instructs the socket to BeginAccept() again...
*/
//while (true)
//{
connectDone.Reset();
S.BeginAccept(new AsyncCallback(AcceptConnection), Channel);
connectDone.WaitOne();
//}
}
catch (System.Net.Sockets.SocketException SockEx)
{
Console.WriteLine("*****[" + name + "] " + SockEx.SocketErrorCode + ":");
Console.WriteLine("*****[" + name + "] " + SockEx.Message);
}
}
}
由於異步方法並不真正「完成」並返回一個信號用於其他任何事情繼續。在上面的Thread.Start()之後實現的任何命令都無法正常工作。例如,在StartListen中,請注意我有一個isListening = true
。在我啓動線程後,我想使用屬性IsListening。它總是被返回爲假。
我應該如何開始線程。異步方法(即ThreadStart.BeginInvoke())是否可以選擇?是不是很類似於使用ManualResetEvent?
我以前沒有用過'volatile'。我會閱讀它。使用TcpListener並不完全沒有問題。但是,我已經完成了編寫和使用Sockets類的所有異步操作。我選擇使用基類而不是簡單地在TcpListener/TcpClient上進行操作。 :) – IAbstract 2009-11-17 18:11:56
使用'Socket'類沒有錯。只是'TcpListener'更容易,因爲它是專門爲你如何使用'Socket'而設計的。 – 2009-11-17 18:29:23