我有一个使用.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或我应该考虑的其他任何线程技术,我需要更改什么,并确保正确关闭事物?该站点通常只有几十个并发用户,并且只要他们加载页面就会进行此调用 - 因此它不是大量的线程。
我还会添加异常处理,以确保没有任何事情发生。
答案 0 :(得分:2)
为了正确使用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
在眼睛(意见)上更容易。这将在线程池中使用线程,但除非您在单核机器上运行该网站,否则我怀疑是否有人会注意到。
在线程模型之外,还有更多架构方法可以减少数据库命中率,但是你的问题是如此具体,如果不了解更多内容,我就无法提出建议。