我像这样开始TCPListener,当工作完成后,我关闭了Socket。我想知道我开始的Thread是否是这样的
ThreadPool.QueueUserWorkItem(ConnectClientsThredProc, args);会自我毁灭所以我不需要任何外部控制。
,谁愿意这么高兴地解释一下,我是否担心过,,谢谢!
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;
}
}
}发布于 2016-11-01 16:05:00
当ConnectClientsThredProc退出时,线程不会“消失”,而是返回到池(这就是为什么线程池首先存在)。无论如何,您不应该真的关心这一点,除非您在ConnectClientsThredProc中执行了长期运行的任务。如果运行时间很长,最好不要使用线程池线程,而是启动一个新线程(例如,通过Task.Factory.StartNew + TaskCreationOptions.LongRunning )。
另外,您还使用了Task.Factory、异步等待、ThreadPool.QueueUserWorkItem,所有这些都在一段简短的代码中混合在一起。也许您需要更好地理解这些工具是什么,它们之间有什么相似之处(特别是异步\等待)。例如,造成这种情况的原因是什么:
var t = Task.Factory.StartNew(async () =>
{
await StartAsync(hostListenerItem.ClientsMax);
}); 启动一个任务\线程,在其中启动另一个任务,然后等待它退出--没有什么意义。
而不是ThreadPool.QueueUserWorkItem,您可以使用具有相同效果的Task.Run。
https://stackoverflow.com/questions/40363673
复制相似问题