【发布时间】:2014-06-20 03:14:43
【问题描述】:
我有一个 .NET 4.5 的 MVC3 项目(由于各种原因,我们无法升级到 MVC4)。我需要运行三个数据库查询,每个查询都需要几秒钟,以在 AJAX 请求中填充三组数据。
我最初的想法是只进行 3 个单独的 AJAX 调用,但我遇到了最大并发 AJAX 请求的问题 - 我们有很多其他 AJAX 调用同时进行,所以这 3 个在客户端被阻止,而等待所有呼叫清除。
所以我试图将它放在一个 AJAX 调用中,但我仍然想同时执行三个查询。
由于它是 MVC3,我显然无法在三个任务上使用 await Task.WhenAll(tasks) 完成简单的 async Task<JsonResult>。
除了简单的“即发即弃”的东西之外,我没有做过很多多线程,所以我想确保我做对了。
以下简单的方法可以正常工作,但我很确定这不是正确的方法 - 我读过很多人谈论 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 或我应该考虑的任何其他线程技术,我需要进行哪些更改,并确保我正确地关闭事物?该站点通常只有几十个并发用户,并且每当他们加载页面时都会进行此调用 - 所以它不是大量的线程。
我还将添加异常处理以确保不会发生任何问题。
【问题讨论】:
-
我当然不建议将多线程用于异步工作。请改用
AsyncManager/AsyncController。如果你绝对坚持线程,至少使用Parallel而不是Thread。 -
@StephenCleary 谢谢 - 我最初只是想一直使用正常的异步任务,但是当我发现 MVC3 显然无法执行异步操作时被关闭了 - 我认为这意味着 TPL 没有完全可以工作,但似乎并非如此。通过使用
Task.Factory创建任务,我确实让事情正常工作 - 你同意这是一个好方法吗?或者将AsyncController放在一起真的值得吗? -
不,我不推荐
Task.Factory.StartNew(尽管Task.Factory.FromAsync可以)。 -
@StephenCleary 我试试看,谢谢。感谢您的建议。
标签: c# multithreading asp.net-mvc-3