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;
}
}
}
der Thread wird ausgeführt, bis die Methode ausgeführt wird Exits – pm100
@ 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? –
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