【发布时间】:2020-09-17 05:09:13
【问题描述】:
我目前正在尝试通过线程池接受传入连接,这一切正常,但提出了以下问题:
如果我在线程池处理前一个连接之前获得一个新连接怎么办。 传递给函数(在本例中为客户端)的对象是被新连接替换还是会同时记住两者?
我认为它忘记第一个客户端的原因是因为传递的变量只是一个引用,对吗?
代码如下:
public static void Initialize()
{
socket.Start();
System.Threading.Thread newConnection = new System.Threading.Thread(() =>
{
while (isOnline)
{
System.Net.Sockets.TcpClient client = socket.AcceptTcpClient();
System.Threading.ThreadPool.QueueUserWorkItem(HandleNewClient, client);
}
})
{
IsBackground = true,
Name = "newConnection",
Priority = System.Threading.ThreadPriority.Highest
};
}
我希望这对你们来说很清楚。 提前感谢您对此进行调查。
【问题讨论】:
-
socket未定义为参数,因此它是类范围或静态。这通常是一个坏主意。套接字应该是可处置的,其规则是:“创建。使用。处置。全部在同一段代码中,最好使用 using 块”。我能想到的一个例外是日志文件——或者更确切地说,它们或多或少地对整个应用程序作为“使用”范围负责。 -
您将该函数标记为无效,这是一个潜在问题。对于各种风格的多任务处理,意外吞下异常是一个大问题。除非线程池负责捕获和公开异常,否则您将遇到问题。
-
Mutlithreading 似乎也太过分了,因为没有任何 CPU 限制。这可以仅通过异步来完成。那么抛出一个线程池的整个想法是没有意义的。他们有一个 shared 套接字。在一个资源上工作的多件事只会导致问题。使用线程池进行多线程似乎是一个 XY 问题。
-
@Christopher 首先感谢您的快速回复。其次,这是我捕获新连接并将套接字复制到他们自己的线程并从那里处理所有内容的部分。我不能让多个线程监听同一个端口接受客户端,对吗?还是使用按顺序执行的多个任务相互等待?
标签: c# multithreading threadpool