如果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数据,所以我希望它是多线程的。
提前感谢!:)
您混淆了并行性和异步性。即使您的操作是同步的,您的Web API仍然能够同时为多个请求提供服务(即并行)。
事实上,就客户端而言,使操作异步绝对没有可观察到的效果(除了性能提升之外)。
类似地,此代码是异步的,但不是并行的:
var displaycurrencies = await apiClient.getListAsync<Currency>(ApiUrls.CURRENCY, null);
var paymentMethods = await apiClient.getListAsync<PaymentMethod>(ApiUrls.PAYMENT_METHOD, null);
它是异步的,因为它不会阻塞正在执行的线程(您使用的是异步I/O),但它不是并行的,因为您一次执行一个操作。
因此,您的目标是不阻塞客户端的主线程(即,您希望异步调用web服务)。
- 服务器与此完全无关。客户端的异步与服务器的并行性和/或异步性完全无关
- 您所需要做的就是使用异步I/O,您已经在使用
request.GetResponseAsync()
进行异步I/O了 - 这不是多线程。
GetResponseAsync
不会创建新线程。有关详细信息,请参阅Stephen Cleary的《没有线索》 - 我会避免使用"多线程"这个术语。它太宽泛了,人们使用它时往往意味着不同的东西。我会使用"异步"/"并行"这两个术语,因为它们有更精确的含义。创建多个线程是实现这两个目标的一种方式(但不是唯一的方式)