2016-10-28 32 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));