2010-12-29 3 views
0

새 스레드에서 클래스를 생성하는 방법은 무엇입니까? Server라는 고정 클래스와 ClientHandler라는 비 정적 클래스가 있습니다. 새 Thread에서 새 ClientHandler 인스턴스의 생성자를 실행하고 싶습니다. 생성자는 2 개의 인수를 취합니다. 여러 접근법을 시도했지만 프로세스의 스레드 수가 증가하지 않습니다. 코드 스 니펫은 다음과 같습니다.새 스레드에서 클래스를 생성하는 방법은 무엇입니까?

public static class Server 
{ 
    //... 

    public static void AcceptConnection(IAsyncResult iar) 
    { 
     var oldserver = (Socket) iar.AsyncState; 
     var client = oldserver.EndAccept(iar); 
     Console.WriteLine("Client [{0}] connected from {1}.", CHandlerIndex, client.RemoteEndPoint.ToString()); 

     new ClientHandler(client, CHandlerIndex); //This has to run in a new thread. 

     CHandlerIndex++; 
     ServerSocket.BeginAccept(new AsyncCallback(AcceptConnection), ServerSocket); 
    } 
} 

public class ClientHandler 
{ 
    private readonly Socket _client; 
    private readonly Parser _pParser; 
    public Security S; 
    public int ClientIndex; 

    //... 

    public ClientHandler(Socket cSocket, int cI) 
    { 
     _client = cSocket; 
     InitSecurity(); 
     _pParser = new Parser(this); 
     ClientIndex = cI; 
    } 

    //... 
} 

답변

0

비동기와 스레드는 동의어가 아닙니다. 새로운 쓰레드가 쓰레드 풀, 원시 쓰래드 (Threadstart ...)를 사용하여 명시 적으로 만들거나 새로운 작업 병렬 라이브러리를 사용하여 보길 원하는 경우.

+0

왜 비동기식과 스레드식이 같지 않은가? 나는 그들이 그렇다고 말한 적이 없다. – lesderid

+0

이것은 내 질문에 대한 직접적인 대답이 아닙니다. – lesderid

+1

실제로, 스레드를 직접 생성하라는 두 가지 답변이 있습니다. 자습서가 있습니다. http://msdn.microsoft.com/en-us/library/aa645740(v=vs.71).aspx. 문제가 생성자 변수 인 경우 더 명확하게 질문하십시오. "ParameterizedThreadStart"를 사용하고 매개 변수를 래핑 할 클래스를 생성해야합니다 (객체 배열이 수행 할 것임). http://msdn.microsoft.com/en-us/library/system.threading.parameterizedthreadstart.aspx – Doobi

2

음, 클래스 (객체)가 특정 스레드에서 실행되지 않습니다. 메서드 만 수행합니다. 다른 스레드에서 생성자를 실행하라는 당신의 요청은 무의미 해 보입니다. 다른 메소드가 실행되는 곳/방법에 아무런 영향을 미치지 않습니다.

새 ClientHandler 인스턴스가 루핑되지 않은 것처럼 보이는 코드에서 가비지 수집이 가능합니다.

ClientHandler에는 다른 방법이 있습니까? 다른 스레드에서 실행될 수 있습니다.

+0

개체가 특정 스레드에서 '실행'하지 않는다는 것을 알고 있습니다. 내 질문은 어떻게 다른 스레드에서 새 개체의 생성자를 실행했다. 내 생각은 모든 메소드 (생성자로 시작)에 대해 ClientHandler 인스턴스 당 하나의 스레드를 갖는 것이었다. 그래서 네, ClientHandler 다른 방법이 있습니다. (보내기, 받기, InitSecurity 등) – lesderid

+0

어떤 제안? – lesderid

+0

난 당신이 ctor 이외의 방법이 필요하다고 생각, 그 처리/대기, 스레드에서 실행합니다. –

관련 문제