我正在用C#编写TCP服务器,我正在使用BeginXXX和EndXXX方法进行异步通信。如果我理解正确,当我使用BeginXXX时,请求将在线程池中处理(当请求准备好时),而主线程继续接受新连接。
问题是如果我在其中一个AsyncCallbacks中执行阻止操作会发生什么?将阻塞操作作为任务运行会更好吗?任务使用线程池也不是吗?
用例如下:
主线程设置一个侦听套接字,它使用BeginAccept接受连接,并使用BeginReceive开始侦听这些连接。收到完整的消息后,将根据消息的内容调用一个函数,在80%的情况下,这些函数将启动数据库查询/插入/更新。
答案 0 :(得分:2)
答案 1 :(得分:1)
问题是如果我在其中一个AsyncCallbacks中执行阻止操作会发生什么?将阻塞操作作为任务运行会更好吗?
如果你经常这么做或者太长时间,那么ThreadPool会增长。可能会导致应用程序崩溃。
因此尽可能避免阻塞。但一点点应该是可以接受的。请记住,ThreadPool将每500毫秒增加1个新线程。因此,请确保并确认它将在某些合理数量的线程上达到平衡。
一个钝器可能会限制游泳池的MaxThreads。
任务使用线程池也不是吗?
是的,所以你的选择有限。