【问题标题】:Do you need to multi thread a caller if the API is already multithreaded? ASP.Net MVC如果 API 已经是多线程的,是否需要多线程调用者? ASP.Net MVC
【发布时间】:2015-11-25 10:24:18
【问题描述】:

所以我有一个 API 上的 Task 方法,比如这个,还有很多其他遵循类似格式的方法

[ResponseType(typeof(MemberMasterItemViewModel))]
[Route("memberMaster/{memberID}")]
[HttpPut]
public async Task<IHttpActionResult> PutMemberMaster(int memberID,MemberMastermemberMaster)
    {
        //does a load of stuff here, validation etc, updates DB                 
        return Ok(UpdatedItem);
    }

这样的 api 方法由 MVC Web 应用程序在这样的操作方法中调用..

[HttpGet]
[SetupViewBag]
public async Task<ActionResult> Details()
{
        var account = new MemberMasterView();
        var displaycurrencies = await apiClient.getListAsync<Currency> ApiUrls.CURRENCY, null);
        var paymentMethods = await apiClient.getListAsync<PaymentMethod>   (ApiUrls.PAYMENT_METHOD, null);
        return View(account);
}

现在鉴于 API 已经可以处理多个请求,因为它的方法是异步的,我认为调用者/Web 应用程序仍然需要在自己的端多线程,否则调用者 IIS 主机中的主工作线程仍然只能一次执行一条语句,让其他线程无所事事?由于网络应用线程与 API 线程无关。

apiclient 是一个 HttpWebRequest 的包装器,它使用了这个

var response = await request.GetResponseAsync();

肯定要利用多线程 API,您需要这样做吗?如果我只是使用普通的 GetResponse,那么我的工作线程仍然会等待 API 执行它的操作吗?

我有很多 API 调用来设置各种 json 数据,所以我希望它是多线程的。

提前致谢! :)

【问题讨论】:

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


    【解决方案1】:

    您将并行性与异步性混淆了。即使您的操作是同步的,您的 Web API 仍然能够同时处理多个请求(即并行性)。

    事实上,就客户端而言,使动作异步绝对没有明显的影响(除了性能提升)。

    同样,这段代码是异步的,但不是并行的:

    var displaycurrencies = await apiClient.getListAsync<Currency>(ApiUrls.CURRENCY, null);
    var paymentMethods = await apiClient.getListAsync<PaymentMethod>(ApiUrls.PAYMENT_METHOD, null);
    

    它是异步的,因为它不会阻塞正在执行的线程(您正在使用异步 I/O),但它不是并行的,因为您一次执行一个操作。


    所以您的目标是不阻塞客户端的主线程(即,您希望异步调用 Web 服务)。

    1. 服务器与此完全无关。客户端的异步与服务器的并行和/或异步完全没有关系
    2. 您需要做的就是使用异步 I/O,您已经在使用 request.GetResponseAsync()
    3. 这不是多线程。 GetResponseAsync 不会创建新线程。有关详细信息,请参阅 Stephen Cleary 的There is no thread
    4. 我会避免使用术语“多线程”。它太宽泛了,人们在使用它时往往意味着不同的东西。我会使用术语“异步”/“并行”,因为它们具有更精确的含义。创建多个线程是实现这两个目标的一种方式(但不是唯一方式)。

    【讨论】:

    • 嗯,这是我追求的性能提升。即使 web api 可以服务多个请求,如果调用者中的主线程没有被阻塞,那肯定是一件好事。我不是在并行处理之后,因为 API 调用有时依赖于前一个完成。例如,我需要在创建订单之前创建一个客户。非常感谢。
    • @Luke 我很困惑......你是说服务器中的异步会影响调用者中的主线程吗?如果是这样,它不会。
    • 客户端对其异步/并行性负全部责任。我不确定您要做什么,或者您的问题是什么。
    • 好吧,我的问题是如果 Web API 已经是多线程的,那么是否值得让调用者多线程?我有一个发送五个请求来创建各种记录的操作,这看起来很多,所以即使 API 是多线程的,如果调用者不是,那么主线程仍然必须等待 api 调用。
    • 异步并没有让它更快,事实上对于单个请求,由于设置回调的开销成本,它通常会慢一点。 asyc 给您的是负载下性能的较慢下降。因此,如果我们有负载与速度的关系图,则同步请求将类似于 y=-10x + 5000,而异步将是 y=-9.5x + 4900,斜率较浅,但从较低点开始。
    猜你喜欢
    • 1970-01-01
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多