私はこのように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;
}
}
}
実行されるメソッドが終了するまでスレッドが実行されます。 – pm100
@ pm100 'args.TcpClient.Client = null; 'スレッド'はまだ存在しますか?だから、私は発砲するイベントが必要だし、外部コードを使ってこの「スレッド」を破壊する必要がありますか? –
しかし、そのようなtcp接続スレッドを実行すべきではありません。 queueuserworkitemは、キューに入れられたバックグラウンドタスクを対象としています。あなたが望むものではないので、あなたは今接続を処理する必要があります。明示的にスレッド – pm100