我的情况是这样,我有一个文件,在一两个小时(mp3,视频等)的过程中慢慢填充。在填充此文件时,许多用户都连接到服务器,以便在添加到服务器时接收新数据。
当每个访问者连接到服务器时,IHttpAsyncHandler从线程池分配一个线程来处理请求。但是,使用默认线程池设置,这意味着一次只能有20个访问者连接到服务器(单个处理器)。
因为大多数情况下这些线程只是在等待新数据,所以将线程释放到池中的最佳方法是什么,并在新数据可用时重新激活。
非常感谢, 安以轩
答案 0 :(得分:1)
我会为此目的使用常规Thread
。 .NET ThreadPool
的设计并不是为了支持(长期运行)线程的释放和重新激活,具体取决于它们的内部状态......至少,你必须做一些创造性的编程才能实现如果你坚持使用ThreadPool
(即将逻辑分解为由ThradPool
执行的小异步任务),那么所需的行为。
如果您使用Thread
,那么您可以直接控制所有活动线程,这样您就可以同时接受更多访问者。
答案 1 :(得分:0)
F#有一个名为Asynchronous Workflows的功能,非常适合这类事情。当您的代码在外部数据源上等待时,该线程将返回到线程池以供其他用途。当新数据到达时,工作流会从池中获取一个线程,并使用它从您停止的位置恢复代码。通过这种方式,您永远不必占用一个只在I / O上等待的线程。
为这一用途学习一种新语言可能有点过头了,但是当涉及异步I / O时,F#会覆盖其他所有CLR语言,除此之外,它还是一种非常有趣的语言。