【发布时间】:2017-03-14 19:19:00
【问题描述】:
我像这样开始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;
}
}
}
【问题讨论】:
-
线程会一直运行到它运行的方法退出
-
但是你不应该像那样运行 tcp 连接线程。 queueuserworkitem 用于排队的后台任务。这不是您想要的,您现在需要处理连接。显式启动一个线程
-
不,一旦该方法结束,线程就消失了
-
StartNew不适用于异步,你真的应该使用Task.Run(代替。 (与您的问题无关,而是最佳实践问题) -
我刚才说,它不能解决你的问题,我只是警告你StartNew is dangerous。
标签: c# .net threadpool tcplistener