4

代码:

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

4 回答 4

5

简单地说:不,不要这样做。

也就是说,您可以查看 ASP.Net 中的任务并行库 (TPL),它可以完全实现您想要做的事情。

快速搜索得到了这个帖子,我只是看了一眼,但似乎很中肯:

http://vizagtechie.blogspot.com/2013/03/parallel-programming-in-aspnet-mvc.html

于 2013-10-03T18:14:12.710 回答
4

不,您的服务器将完全受到 DDOS 攻击。至少,从线程池中请求一个线程,而不是手动创建自己的线程。如果线程池用完,您将等待一个可用。服务器的其余部分将继续能够工作。当然,您的里程可能会因许多因素而异。

于 2013-10-03T18:09:14.883 回答
1

每个请求都已经获得了一个线程,因此通过手动添加另一个线程,您将为每个请求创建两个线程,从而有效地让您的服务器能够处理请求。现在,我不会像其他人那样世界末日:在一个足够强大的服务器上,每秒不会处理数千个或更多请求,你可能仍然会没事。不过,它仍然是糟糕的设计。

您没有提到您使用的是哪个版本的 C#,但在 5.0+ 上,您现在拥有async通常处理这种情况的方式:

public async Task<ActionResult> SomeActionWithLongRunningProcess()
{
    await LongRunningProcess();

    return View();
}

这将导致 .NET 卸载请求,释放线程,直到LongRunningProcess()完成。

于 2013-10-03T18:29:35.073 回答
0

您的代码可以在完成 WCF 调用之前完成调用Some Action Method()并返回(出于实际目的,假设这将在 100% 的时间内发生)。如果您希望这种情况发生,那么您的代码就可以了。但是,如果您需要来自服务调用的响应来获取 JSON 结果,那么您的代码就会非常损坏。jsonresultservice.SubmitAndCreateApp(params)sessionModel.IsAppCreated

要解决此问题,您需要阻止操作方法的线程,直到它创建的线程终止。这一事实以及底层 WCF 通信通道已经创建自己的线程以等待来自 WCF 服务调用的响应(同步 WCF 调用实际上只是一个异步调用,它在收到响应之前一直阻塞)使得创建一个新线程无意义。

于 2013-10-03T18:40:38.747 回答