在讨论这个问题之前,我想说,我已经阅读了 IIS 7、7、7.5 的线程建模,因此我知道如何处理线程。
当请求到来时,我的应用程序启动一个线程。
我们可以将线程假设为 cron 作业。
- GET 请求进来,比方说/Handle
- 在/Handle 的范围内,我从该操作启动一个线程,THREAD A
- 我不会长时间轮询 GET 请求,因此它返回到 立即用户。因此处理 GET 的线程被返回到 POOL
- 然后我会等待线程 A 完成后再执行其他操作。
- 据我所知,没有线程正在运行。两个线程都是 处理 GET 和 THREAD A 已退出。
我连续多次提出相同的请求。我总是等待两个线程退出。 过了一会儿 `Thread.Start()1 函数就会阻塞。
问题: 我知道线程正在返回,并且我没有泄漏任何幽灵线程。 为什么 IIS 不允许我在 4-5 个请求后启动新线程。 ?
为用户应用程序创建应用程序线程的正确方法是什么。 如果我说 Thread t= new Thread() ,这是否会从处理 GETS 或 CLR 的池中分配一个线程? 我使用的是 IIS7。
我知道我退出每个线程,我在 THREAD A 上调用 JOIN ,它永远不会阻塞,此时我不担心可扩展性,因此我总是有一个用户按顺序访问服务器。
最佳答案
因此,回答您的问题“为用户应用程序创建应用程序线程的正确方法是什么?”(即 ASP.NET 应用程序) - 您有很多选择:
- 在 ASP.NET 线程上运行,无需任何线程 - ASP.NET 仍将处理多个请求
- 对长时间运行的操作使用异步调用(请参阅 async operations)
- 使用CLR ThreadPool
- 将消息发送到其他服务器(例如使用 WCF 服务),因此长时间运行的处理发生在 Web 服务器外部。
您提到阅读有关 ASP.NET 中的线程的内容,但在 "MSDN: Performing Asynchronous Work, or Tasks, in ASP.NET Applications" 中关于 ASP.NET 中的线程如何工作有一个相对简短的描述。帖子的最后,有一个问题: “Q4:我应该创建自己的线程(新线程)吗?” 该问题的答案是“A4)请不要(创建新线程)。或者将其放在不同的方式,不!!!(...)“。
并回答您的问题:“为什么 IIS 不允许我在 4-5 个请求后启动新线程”? 这确实是一个奇怪的行为,也许 IIS 知道你做错了;)
关于c# - IIS 线程无法启动 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13864662/