2016-10-28 29 views
0

我想用在外部類中實現的方法來啓動Thread,以及我需要傳遞給此方法的對某些外部屬性的引用。從不同的類和參數開始一個線程

的問題是在這裏

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

Visual Studio中說,Acvivate方法應返回Thread。但下面的例子不應該。

我使用這個例子,但它沒有幫助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));