BeginXXX和threadpool

时间:2012-09-30 20:09:16

标签: c#

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

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

用例如下:

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

2 个答案:

答案 0 :(得分:2)

我建议您使用.net 4.5

中引入的SocketAsyncEventArgs

以下是您可以从

开始的一些阅读材料

click me

答案 1 :(得分:1)

  

问题是如果我在其中一个AsyncCallbacks中执行阻止操作会发生什么?将阻塞操作作为任务运行会更好吗?

如果你经常这么做或者太长时间,那么ThreadPool会增长。可能会导致应用程序崩溃。

因此尽可能避免阻塞。但一点点应该是可以接受的。请记住,ThreadPool将每500毫秒增加1个新线程。因此,请确保并确认它将在某些合理数量的线程上达到平衡。

一个钝器可能会限制游泳池的MaxThreads。

  

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

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