Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过MVC3 AJAX调用使用线程或任务_C#_Multithreading_Asp.net Mvc 3 - Fatal编程技术网

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

C# 通过MVC3 AJAX调用使用线程或任务,c#,multithreading,asp.net-mvc-3,C#,Multithreading,Asp.net Mvc 3,我有一个带有.NET4.5的MVC3项目(由于各种原因,我们无法升级到MVC4)。我需要运行三个数据库查询,每个查询需要几秒钟的时间,以便在AJAX请求中填充三组数据 我最初的想法是只进行3次单独的AJAX调用,但我遇到了最大并发AJAX请求的问题-我们有很多其他AJAX调用同时进行,因此在等待所有调用清除时,这3次在客户端被阻止 因此,我试图将其放在一个AJAX调用中,但我仍然希望同时执行这三个查询 由于它是MVC3,我显然不能用等待任务来完成简单的异步任务 我没有做过很多多线程的工作,除了简

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

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

因此,我试图将其放在一个AJAX调用中,但我仍然希望同时执行这三个查询

由于它是MVC3,我显然不能用
等待任务来完成简单的
异步任务

我没有做过很多多线程的工作,除了简单的“点燃并忘记”的东西,所以我想确保我做的是正确的

以下简单的方法可以正常工作,但我很确定这不是正确的方法-我读过很多人谈论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
var threads=newlist();
添加(新线程(()=>x1=Method1());
添加(新线程(()=>x2=Method2());
添加(新线程(()=>x3=Method3());
threads.ForEach(t=>t.Start());
threads.ForEach(t=>t.Join());
//x1、x2和x3现在已填充
为了正确使用ThreadPool或我应该考虑的任何其他线程技术,并确保正确关闭东西,我需要更改什么?该站点通常只有几十个并发用户,并且每次加载页面时都会进行此调用,因此线程数量并不多

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或我应该考虑的任何其他线程技术,并确保正确关闭东西,我需要更改什么

视情况而定

您当前的代码。启动一个新线程会有一个小的性能损失(这就是线程池首先存在的原因),但是对于高吞吐量、高并发性的网站来说,这是一个不错的选择

这就是说,如果你的网站是服务于一个低通过输出低并发用户群,在我看来,这是过度杀戮。在眼睛(观点)上使用这个词要容易得多。这将使用线程池中的线程,但除非您在单核心机器上运行该网站,否则我怀疑任何人都不会注意到


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

谢谢,
Task.Factory
最终运行良好-看起来MVC3仍然可以处理
Task
s,但不是作为操作方法的返回类型。至于体系结构设计,我100%支持你——我很想在这里获得一些缓存,或适当的排队或其他真正的解决方案——只是现在没有时间。实际上我认为,但如果不使用
wait
,实现起来真的很痛苦。谢谢,我会研究一下,但目前只看一眼,与开始/完成和
异步管理器相比,我更喜欢任务模式。杰出的操作
。我当然不建议异步工作使用多线程。改用
AsyncManager
/
AsyncController
。如果你绝对坚持线程化,至少使用
Parallel
而不是
Thread
@StephenCleary谢谢-我本来只想一直使用普通的异步任务,但当我发现MVC3显然不能执行异步操作时,就被关闭了-我认为这意味着TPL根本不起作用,但事实似乎并非如此。通过使用
Task.Factory
创建任务,我确实可以很好地完成任务-您是否同意这是一个好方法?或者真的值得组装一个
AsyncController
?不,我不推荐
Task.Factory.StartNew
(尽管
Task.Factory.fromsync
可以)。@StephenCleary我会试试,谢谢。我很感激你的建议。