2016-11-01 10 views
0

私はこのようにTCPListenerを開始しています。仕事が終わったらSocketを閉じます。 私はThread私はので、私はそれ以上の任意の外部制御を必要としない、それ自体を破壊しようとしている。このThreadPoolの動作とTCPListener

ThreadPool.QueueUserWorkItem(ConnectClientsThredProc, args); 

のように起動しているかどうかを知りたいと思います。

私はそれについて心配していないか説明してくれる人はいないでしょうか? ありがとうございました! ConnectClientsThredProc終了するには、スレッドが「消え」が、(スレッドプールは、最初の場所に存在する理由です)プールに返却されていない

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

実行されるメソッドが終了するまでスレッドが実行されます。 – pm100

+0

@ pm100 'args.TcpClient.Client = null; 'スレッド'はまだ存在しますか?だから、私は発砲するイベントが必要だし、外部コードを使ってこの「スレッド」を破壊する必要がありますか? –

+1

しかし、そのようなtcp接続スレッドを実行すべきではありません。 queueuserworkitemは、キューに入れられたバックグラウンドタスクを対象としています。あなたが望むものではないので、あなたは今接続を処理する必要があります。明示的にスレッド – pm100

答えて

2

。とにかく、ConnectClientsThredProcで長時間実行されたタスクがない限り、実際にはそれを気にするべきではありません。スレッドプールスレッドを使用しないでください(たとえば、Task.Factory.StartNew​​など)。

また、Task.Factory、async \ await、ThreadPool.QueueUserWorkItemを使用して、短いコードのすべてを混在させます。たぶんあなたはこれらのツールと、それらの間の類似点と相違点(特にasync \ await)とは何かを少し良く理解する必要があります。 - ほとんど意味がない

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

は、あなたがまだ別のタスクを開始し、それが終了するのを待ち、その内部タスク\スレッドを起動します。たとえば、その理由は何ですか。

ThreadPool.QueueUserWorkItemの代わりにTask.Runを使用しても同じ効果が得られます。

関連する問題