在一些关于异步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
完成答案 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完成时,它将继续执行方法的其余部分。