关于异步web api 2操作的疑问

时间:2017-05-11 10:52:36

标签: c# asp.net asynchronous

在一些关于异步web api 2操作的文章中,我发现以下代码显示了如何在Web Api 2中实现异步操作:

<svg
  version="1.1"
  xmlns="http://www.w3.org/2000/svg" 
  xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 2000 800">
  <svg:path
    *ngFor="let country of countries; let i = index"
    [attr.data-index]="i"
    (mouseover)="countryHover = country.country_country"
    (click)="clicked(i)"
    class="blob"
    [class.selected]="hasCountry(i)"
    [attr.d]="country.country_path"
    fill="currentColor">
  </svg:path>
</svg>

我认为此代码异步,但它只包含 public class UserController : ApiController { ApiSecurityEntities _db = new ApiSecurityEntities(); public async Task<IHttpActionResult> Delete(Int32 Id) { var record = await _db.UserMaster.Where(f => f.id == Id).FirstOrDefaultAsync(); if (record != null) { _db.UserMaster.Remove(record); await _db.SaveChangesAsync(); return Ok(); } return NotFound(); } } 个字。你能消除我的怀疑吗?

#EDIT

为什么我认为这不是真正的异步代码:

  • 在第一个async/await之后,只有await语句必须等待上一个操作,并且在此块之后不会执行任何其他工作,因此它将同步运行
  • 在第二个if之后有await语句,因此必须等到return完成

1 个答案:

答案 0 :(得分:2)

此代码在I / O方面绝对是真正的异步。

  

在计算机科学,异步I / O或&#34;非顺序I / O&#34;是一个   输入/输出处理的形式,允许其他处理   在传输完成之前继续。

来自wikipedia

在你的情况下,当你等待I / O完成(数据库操作)时,你的方法不会阻塞任何线程,等待你告诉当前线程它可以返回到ThreadPool和在I / O操作完成之前执行任何其他工作。

任何线程(某种处理单元)都不会在DB完成asynchrouns定义后的工作时被阻止。

<强> #EDIT

正如你所说,你的代码执行顺序没有改变,它需要DB的结果来执行下一个语句,但是(!)虽然看起来这个代码阻塞(也就是同步)它will not block any thread执行I / O操作 await关键字允许您等待&#34;以异步的方式获得结果,当I / O完成时,它将继续执行方法的其余部分。