c# - 通过 MVC3 AJAX 调用使用线程或任务

标签 c# multithreading asp.net-mvc-3

我有一个使用 .NET 4.5 的 MVC3 项目(由于各种原因我们无法升级到 MVC4)。我需要运行三个数据库查询,每个查询都需要几秒钟,以在 AJAX 请求中填充三组数据。

我最初的想法是只进行 3 个单独的 AJAX 调用,但我遇到了最大并发 AJAX 请求的问题 - 我们同时进行了很多其他 AJAX 调用,所以这 3 个在客户端被阻止,而等待所有调用清除。

所以我试图将它放在一个 AJAX 调用中,但我仍然想同时执行三个查询。

因为它是 MVC3,我显然不能做简单的 async Task<JsonResult>await Task.WhenAll(tasks)在三个任务上。

除了简单的“一劳永逸”的东西,我没有做过很多多线程,所以我想确保我做的是正确的。

下面的简单方法可以正常工作,但我很确定这不是正确的方法 - 我读过很多人谈论 ASP.NET 如何对线程处理挑剔,尤其是当你开始使用很多线程数。

var threads = new List<Thread>();
threads.Add(new Thread(() => x1 = Method1()));
threads.Add(new Thread(() => x2 = Method2()));
threads.Add(new Thread(() => x3 = Method3()));
threads.ForEach(t => t.Start());
threads.ForEach(t => t.Join());
// x1, x2, and x3 are now populated

我需要更改什么才能正确使用 ThreadPool 或我应该考虑的任何其他线程技术,并确保我正确关闭这些东西?该站点通常只有几十个并发用户,每当他们加载页面时都会进行此调用 - 因此线程数不是很多。

我还将添加异常处理以确保不会出现任何问题。

最佳答案

What do I need to change in order to properly use the ThreadPool or whatever other threading techniques I should be considering, and make sure I close things properly?

视情况而定

您当前的代码 won't reuse a thread from the thread pool and possibly thread-starve the PoolThread causing a 500 (ASP.Net request processing stalled because the CLR thread pool is out of threads) .启动一个新线程会有一点性能损失(这也是线程池最初存在的原因),但是对于高吞吐量的高并发网站来说,这是一个不错的选择。

也就是说,如果您的网站服务于低吞吐量、低并发用户群,我认为它就完蛋了。使用 Task.Factory 在眼睛(意见)上要容易得多.这将使用线程池中的线程,但除非您在单核机器上运行网站,否则我怀疑没有人会注意到。

在线程模型之外,还有更多架构方法来减少数据库命中,但您的问题非常具体,如果不了解更多信息,我无法提出太多建议。

关于c# - 通过 MVC3 AJAX 调用使用线程或任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24313852/

相关文章:

c# - 在只有 2.0 框架的服务器上执行编译后的 3.5 代码时出现问题

c# - 单击任务栏中的应用程序图标时 WPF 中的对话框消失

Java 从多次调用中收集 CompletableFuture 的结果

android - Android上下文线程检查

asp.net-mvc-3 - MVC3 不显眼的验证在 IE 中不起作用

asp.net-mvc - 设置 MVC3 DateTime 的 DataFormatString

c# - 垃圾收集不适用于 OpenTK,或者我是否缺少足够的处理?

java - 在开始编码之前如何处理并发

asp.net-mvc - 如何从ActionExecuting过滤器内部获取路线值?

c# - XElement 有类似 XmlNodeList 的东西吗