【问题标题】:Using threads or tasks with MVC3 AJAX calls通过 MVC3 AJAX 调用使用线程或任务
【发布时间】: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


【解决方案1】:

为了正确使用 ThreadPool 或我应该考虑的任何其他线程技术,我需要进行哪些更改,并确保我正确地关闭事物?

视情况而定

您当前的代码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 在眼睛上(意见)要容易得多。这将使用线程池中的线程,但除非您在单核机器上运行网站,否则我怀疑有人会注意到。

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

【讨论】:

  • 谢谢,Task.Factory 最终运行良好 - 看起来 MVC3 仍然可以处理 Tasks,但不能作为操作方法的返回类型。至于架构设计,我 100% 支持你——我很想在这里获得一些缓存,或者适当的队列或其他一些真正的解决方案——只是现在没有时间。
  • 其实我觉得AsyncController was added in MVC 1.0,但是不使用await来实现真的很痛苦。
  • 谢谢,我会调查一下,但到目前为止,我绝对喜欢 Task 模式,而不是 Begin/Completed 和 AsyncManager.OutstandingOperations
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2016-08-15
相关资源
最近更新 更多