1

我正在用 C# 编写 TCP 服务器,并且正在使用 BeginXXX 和 EndXXX 方法进行异步通信。如果我理解正确,当我使用 BeginXXX 时,请求将在线程池中处理(当请求准备好时),而主线程继续接受新连接。

问题是如果我在这些 AsyncCallback 之一中执行阻塞操作会发生什么?将阻塞操作作为任务运行会更好吗?任务也使用线程池,不是吗?

用例如下:

主线程设置一个监听套接字,它使用 BeginAccept 接受连接,并开始使用 BeginReceive 监听这些连接。当收到完整的消息时,会根据该消息的内容调用一个函数,在所有情况下,80% 的函数将启动数据库查询/插入/更新。

4

2 回答 2

2

我建议你使用 .net 4.5 中引入的 SocketAsyncEventArgs

这里有一些你可以开始的阅读材料

点我

于 2012-09-30T20:47:32.090 回答
1

问题是如果我在这些 AsyncCallback 之一中执行阻塞操作会发生什么?将阻塞操作作为任务运行会更好吗?

如果你这样做太频繁或太长时间,那么 ThreadPool 将会增长。可能会导致您的应用程序崩溃。

所以尽量避免阻塞。但是一点点应该是可以接受的。请记住,ThreadPool 将以每 500 毫秒 1 个新线程的速度增长。因此,请确保并验证它将在一些合理数量的线程上保持平衡。

一个钝器可能是限制池的 MaxThreads。

任务也使用线程池,不是吗?

是的,所以你的选择是有限的。

于 2012-09-30T20:19:51.427 回答