2016-10-28 8 views
0

Threadを外部クラスに実装されたメソッドで開始したいと思います。また、このメソッドへの参照をいくつかの外部プロパティに渡す必要があります。別のクラスとパラメータからスレッドを開始する

問題は、Visual StudioがAcvivate方法はThreadを返すべきであると言う

Thread t = new Thread(Agent.Activate(agentParameters, ref tcpListener)); 

ここにあります。しかし、下の例では、そうしてはいけません。

私はこの例を使用しますが、それは助けになりませんhttps://msdn.microsoft.com/en-us/library/system.threading.thread.setdata(v=vs.110).aspx。ここに私のコードは、あなたが新しいスレッドにデリゲートとしてあなたの方法を渡す必要が

class TCPListenerManager 
    { 
     TcpListener tcpListener; 

     public TCPListenerManager(HostListenerItem hostListenerItem) 
     { 
      tcpListener = new TcpListener(IPAddress.Parse(hostListenerItem.IP4), hostListenerItem.Port); 

      for (int i = 0; i < hostListenerItem.ClientsMax; i++) 
      { 
       var agentParameters = new AgentParameters(); 
       Thread t = new Thread(Agent.Activate(agentParameters, ref tcpListener)); 
       t.Start(); 
      } 
     } 

    } // end of class DeviceAgent 


class Agent 
    { 
     [ThreadStaticAttribute] 
     static int threadSpecificData; 

     static public AgentParameters Parameters; 

     public static void Activate(AgentParameters agentParameters, ref TcpListener tcpListener) 
     { 
      Parameters = agentParameters; 
      threadSpecificData = Thread.CurrentThread.ManagedThreadId; 

      var socket = tcpListener.AcceptSocket(); 
      if (socket.Connected) 
      { 
       // 
       // logger.Info("Socket.Connected on" + socketParameters.HostListenerItem.Name + " " + socketParameters.HostListenerItem.Url); 
      } 
     } 
    } // end of Agent 


    class AgentParameters 
    { 
     public HostListenerItem HostListenerItem { get; set; } 

     public AgentParameters() 
     { 
      HostListenerItem = new HostListenerItem(); 
     } 
    } 
+0

これClientsMaxは、することになっていない方法です。ループを受け入れ、受け入れられたクライアントごとにスレッドを開始するスレッドを1つ開始します。 'if(socket.Connected)'も何もしません。 – usr

答えて

3

です:

Thread t = new Thread(() => Agent.Activate(agentParameters, ref tcpListener)); 
関連する問題