您可以通过在控制器中使用同步代码上的Task.Run来提高吞吐量吗?

时间:2016-11-22 09:52:46

标签: c# asp.net-mvc task

在我的控制器中,我需要调用一个发出http请求的方法BlockingHttpRequest()。运行速度相对较慢,并阻塞线程 我无法重构该方法以使其异步。

最好将此方法包装在Task.Run中以至少释放UI /控制器线程吗? 我不确定这是否能真正改善任何事情,或者只是做得更多。

public class MyController : Controller
{
    public async Task<PartialViewResult> Sync()
    {
        BlockingHttpRequest();
        return PartialView();
    }

    public async Task<PartialViewResult> Async()
    {
        await Task.Run(() => BlockingHttpRequest());
        return PartialView();
    }
}

实际上我有几种情况,BlockingHttpRequest()分别需要500毫秒和5000毫秒。

我知道Task.Run()不会让我的函数更快返回。

我认为增加吞吐量可能会带来一些好处。通过释放控制器的线程,这是否使其可供其他用户使用?这意味着在MVC中,控制器线程和后台工作线程之间存在差异。

2 个答案:

答案 0 :(得分:3)

  

通过释放控制器的线程,这是否可以让其他用户使用?

是的,确实如此。

  

这意味着在MVC中,控制器线程和后台工作线程之间存在差异。

不,没有。因为就像你正在释放一个现在可以为其他请求提供服务的线程池线程一样,你也会消耗一个新的线程池线程,现在不能去服务其他请求。因此,能够处理其他请求的线程总数是相同的。

  

我认为提高吞吐量可能会带来一些好处。

没有。你在线程之间浪费了一些时间上下文切换,等待新工作者的调度,以及与你正在做的工作相关的其他开销,而你却得不到任何回报。

答案 1 :(得分:0)

因为该方法是阻塞的,所以将它移动到另一个线程上什么都不会实现。只是浪费一个线程而不是另一个线程,两者都是相同的。

此外,由于线程仍然以任何方式浪费,因此没有增加的可伸缩性或吞吐量。