ThreadStart startThread =
delegate
{
mySocket.StartListen();
};
mySocket 지금)을 (듣기에 반복 될 때 I : 여기
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 속성을 사용하려고합니다. 항상 false로 리턴됩니다.
스레드를 어떻게 시작해야합니까? 비동기 메서드 (ThreadStart.BeginInvoke())를 더 선호 할 수 있습니까? ManualResetEvent를 사용하는 것과 비슷하지 않습니까?
이전에 '휘발성'을 사용하지 않았습니다. 나는 그것에 대해 읽을 것이다. TcpListener를 사용하는 것은 완전히 의문의 여지가 없습니다. 그러나 모든 비동기 작업은 이미 Socket 클래스로 작성하고 작업하고 있습니다. TcpListener/TcpClient에서 쉬운 방법을 사용하는 대신 기본 클래스로 작업하기로했습니다. :) – IAbstract
'Socket' 클래스를 사용하는 것은 잘못이 아닙니다. 그것은'TcpListener'가'Socket'을 어떻게 사용하는지 명시 적으로 설계 되었기 때문에 훨씬 쉽습니다. –