代码:
class Controller
{
Some Action Method()
{
...
...
new Thread(() =>
{
//WCF cal- wil execute for around 10 secs.
var result = service.SubmitAndCreateApp(params);
sessionModel.IsAppCreated = result;
}).Start();
return jsonresult;
}
}
由于我的WCF调用花费了太多时间,我不想使用线程池并让它变得饥饿。
这里很明显,正在为每个客户端请求创建线程。如何在.Net 4.0(VS 2010)中优化此方法或任何其他替代方法来实现此目的?
答案 0 :(得分:5)
简单地说:不,不要这样做。
也就是说,您可以查看ASP.Net中的任务并行库(TPL),它可以完全实现您的目标。
快速搜索产生了这个帖子,我只是瞥了一眼,但似乎在点上:
http://vizagtechie.blogspot.com/2013/03/parallel-programming-in-aspnet-mvc.html
答案 1 :(得分:4)
没有。您的服务器将完全获得DDOS。至少,请求线程池中的线程,而不是手动创建自己的线程。如果线程池用完了,你将等待其中一个可用。服务器的其余部分将继续工作。当然,您的里程可能因许多因素而异。
答案 2 :(得分:1)
每个请求都已经获得一个线程,因此通过手动添加另一个线程,您将为每个请求创建两个线程,从而有效地使您的服务器能够记录请求。现在,我不会像其他人那样成为世界末日:在一台功能强大的服务器上,每秒钟不会发出数千个请求,你可能仍然可以。不过,这仍然是糟糕的设计。
您没有提到您正在使用的C#版本,但在5.0+上,您现在拥有async
,这就是您通常处理这种情况的方式:
public async Task<ActionResult> SomeActionWithLongRunningProcess()
{
await LongRunningProcess();
return View();
}
这将导致.NET卸载请求,释放线程,直到LongRunningProcess()
完成。
答案 3 :(得分:0)
您的代码可以完成对Some Action Method()
的调用并在完成对jsonresult
的WCF调用之前返回service.SubmitAndCreateApp(params)
(出于实际目的,假设这将在100%的时间内发生)。如果您希望这种情况发生,那么您的代码就可以了。但是,如果您需要sessionModel.IsAppCreated
中服务调用的响应来获取JSON结果,那么您的代码就会崩溃。
要解决此问题,您需要阻止操作方法的线程,直到它创建的线程终止。这个事实以及底层WCF通信通道已经创建自己的线程以等待来自WCF服务调用的响应这一事实(同步WCF调用实际上只是一个阻塞直到收到响应的异步调用)使得创建一个新线程没有意义的。