是否可以为每个客户端请求创建线程?

时间:2013-10-03 18:06:48

标签: c# .net asp.net-mvc multithreading wcf

代码:

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)中优化此方法或任何其他替代方法来实现此目的?

4 个答案:

答案 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调用实际上只是一个阻塞直到收到响应的异步调用)使得创建一个新线程没有意义的。