ASP.NET线程池的正确用法是什么?

时间:2010-08-25 15:20:54

标签: asp.net multithreading threadpool

我的情况是这样,我有一个文件,在一两个小时(mp3,视频等)的过程中慢慢填充。在填充此文件时,许多用户都连接到服务器,以便在添加到服务器时接收新数据。

当每个访问者连接到服务器时,IHttpAsyncHandler从线程池分配一个线程来处理请求。但是,使用默认线程池设置,这意味着一次只能有20个访问者连接到服务器(单个处理器)。

因为大多数情况下这些线程只是在等待新数据,所以将线程释放到池中的最佳方法是什么,并在新数据可用时重新激活。

非常感谢, 安以轩

2 个答案:

答案 0 :(得分:1)

我会为此目的使用常规Thread。 .NET ThreadPool的设计并不是为了支持(长期运行)线程的释放和重新激活,具体取决于它们的内部状态......至少,你必须做一些创造性的编程才能实现如果你坚持使用ThreadPool(即将逻辑分解为由ThradPool执行的小异步任务),那么所需的行为。

如果您使用Thread,那么您可以直接控制所有活动线程,这样您就可以同时接受更多访问者。

答案 1 :(得分:0)

F#有一个名为Asynchronous Workflows的功能,非常适合这类事情。当您的代码在外部数据源上等待时,该线程将返回到线程池以供其他用途。当新数据到达时,工作流会从池中获取一个线程,并使用它从您停止的位置恢复代码。通过这种方式,您永远不必占用一个只在I / O上等待的线程。

为这一用途学习一种新语言可能有点过头了,但是当涉及异步I / O时,F#会覆盖其他所有CLR语言,除此之外,它还是一种非常有趣的语言。