如果API已经是多线程的,您是否需要对调用程序进行多线程处理?ASP.Net MVC

本文关键字:程序 调用 多线程处理 MVC Net ASP API 多线程 是否 如果 | 更新日期: 2023-09-27 18:24:12

所以我在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 Host中的主工作线程一次只能执行一条语句,而其他线程什么都不做?由于web应用程序线程与API线程无关。

apiclient是使用此的HttpWebRequest的包装器

var response=等待请求。GetResponseAsync();

当然,要利用多线程API,你需要这样做吗?如果我只是使用了一个普通的GetResponse,那么我的工作线程还会一直在等待API做它的事情吗?

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

提前感谢!:)

如果API已经是多线程的,您是否需要对调用程序进行多线程处理?ASP.Net MVC

您混淆了并行性和异步性。即使您的操作是同步的,您的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()进行异步I/O了
  3. 这不是多线程。GetResponseAsync不会创建新线程。有关详细信息,请参阅Stephen Cleary的《没有线索》
  4. 我会避免使用"多线程"这个术语。它太宽泛了,人们使用它时往往意味着不同的东西。我会使用"异步"/"并行"这两个术语,因为它们有更精确的含义。创建多个线程是实现这两个目标的一种方式(但不是唯一的方式)