2010-12-29 13 views
0

新しいスレッドでクラスを作成する方法は?私はServerという静的クラスとClientHandlerという非静的クラスを持っています。私は新しいスレッドで新しい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

どうしてAsyncとThreadedが同じではないのですか?私は彼らが言ったことはありません。 – lesderid

+0

これは私の質問に直接答えはありません。 – lesderid

+1

実際には、スレッドを自分で作成するという2つの答えがあります。ここにチュートリアルがあります。 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

私はあなたがスレッド以外のいくつかの方法を必要と思う、それは処理/スレッドを実行するために待機します。 –

関連する問題