2016-11-01 8 views
0

Ich bin TCPListener wie folgt gestartet und wenn die Arbeit erledigt, schließe ich die Socket. Ich möchte wissen, ob die Thread, die ich wie diesesThreadPool Verhalten und TCPListener

ThreadPool.QueueUserWorkItem(ConnectClientsThredProc, args); 

beginnen wird, sich selbst zu zerstören, so dass nicht ich brauche jede externe Kontrolle darüber.

Würde jemand so erfreut erklären, habe ich mir darum sorgen oder nicht. Danke!

class TCPListenerManager 
    { 
     TcpListener tcpListener; 
     HostListenerItem hostListener; 
     private bool _isServerWorking = false; 

    public TCPListenerManager(HostListenerItem hostListenerItem) 
    { 
     hostListener = hostListenerItem; 

     tcpListener = new TcpListener(IPAddress.Parse(hostListenerItem.IP4), hostListenerItem.Port); 

     var t = Task.Factory.StartNew(async() => 
       { 
        await StartAsync(hostListenerItem.ClientsMax); 
       }); 
      } 

    public async Task StartAsync(int clientsMax) 
    { 
        tcpListener.Start(); 
        _isServerWorking = true; 
        for (int i = 0; i < clientsMax; i++) 
        { 
         if (_isServerWorking) 
         { 
          ServerConnectedEventArgs args = new ServerConnectedEventArgs(); 
          args.TcpClient = await tcpListener.AcceptTcpClientAsync(); 
          args.HostListener = hostListener; 

          OnServerConnected(args); 
          ThreadPool.QueueUserWorkItem(ConnectClientsThredProc, args); 
         } 
    } 
} 


private void ConnectClientsThredProc(object obj) 
{  
      var args = (ServerConnectedEventArgs)obj; 

      if (args.TcpClient.Connected) 
      { 
       // Do some job and disconnect 
       args.TcpClient.Client.Close(); 
       args.TcpClient.Client = null; 
      } 
    } 
} 
+0

der Thread wird ausgeführt, bis die Methode ausgeführt wird Exits – pm100

+0

@ pm100 Meinst du nach 'args.TcpClient.Client = null; 'der' Thread' ist noch vorhanden? Also brauche ich ein Ereignis zu schießen und über externen Code dieses 'Thread' zu zerstören? –

+1

aber du solltest den TCP-Verbindungs-Thread nicht so laufen lassen. Das queueuserworkitem ist für in die Warteschlange gestellte Hintergrundaufgaben vorgesehen. Das ist nicht das, was du willst, du brauchst jetzt die Verbindung. Explizit einen Thread starten – pm100

Antwort

2

Wenn ConnectClientsThredProc austritt, wird Faden nicht „weg“, sondern wieder zurück in den Pool (das ist, warum Thread-Pool in erster Linie vorhanden ist). Wie auch immer, Sie sollten sich nicht wirklich darum kümmern, es sei denn, Sie haben eine langwierige Aufgabe in ConnectClientsThredProc ausgeführt. Wenn es lange läuft - besser nicht Thread-Thread verwenden, sondern einen neuen starten (z. B. über Task.Factory.StartNew + TaskCreationOptions.LongRunning).

Sie verwenden auch Task.Factory, async \ erwarten, ThreadPool.QueueUserWorkItem, alles in einem kurzen Stück Code, zusammen gemischt. Vielleicht müssen Sie ein bisschen besser verstehen, was diese Werkzeuge sind und was Ähnlichkeiten und Unterschiede zwischen ihnen sind (besonders async \ erwarten). Zum Beispiel, was ist der Grund dafür:

var t = Task.Factory.StartNew(async() => 
{ 
     await StartAsync(hostListenerItem.ClientsMax); 
});  

Sie starten eine Aufgabe \ Thread, in dessen Inneren Sie noch eine weitere Aufgabe beginnen und dann warten, bis es verlassen zu - macht wenig Sinn.

Anstelle von ThreadPool.QueueUserWorkItem können Sie Task.Run mit dem gleichen Effekt verwenden.