我知道有类似的问题,但我正在努力解决.net中异步编程的概念。作为Web开发人员,我理解异步调用函数不会导致UI阻塞,您可以做其他事情。但是现在我在另一边,编写一个C#Web API服务来从数据库中检索信息并进行一些计算。我通过在函数头中添加async关键字来使控制器中的函数异步,我天真地认为它是它的结尾,但它告诉我我需要在函数中使用await关键字。所以我想出了如何做到这一点(我已经阅读了很多这一点)但我不知道为什么我需要这样做,以及什么时候。比如说我有一个像下面这样的web方法,它调用另外两个函数,但只有一个用await调用。那不好吗?它只会是非阻塞的部分时间吗?然后我创建了另一个没有await关键字的测试函数,它运行正常(底部代码)。
[HttpPost]
public async Task<IHttpActionResult> CalculateBMIAsync([FromBody]MeasureInput patientData)
{
string results = String.Empty;
MeasureReturn returnVal = null;
try
{
string msgInvalid = await Translators.validatePatMonthXML(patientData);
if (String.IsNullOrEmpty(msgInvalid))
{
results = await measureProcessor.CalculateBMI(patientData);
}
else
return new BadRequestWithInfoResult(Translators.CreateErrorXML(new Exception(msgInvalid)));
}
catch (Exception ex)
{
return new BadRequestWithInfoResult(Translators.CreateErrorXML(ex));
}
return Ok<MeasureReturn>(returnVal);
}
使用jquery调用时异步工作的Web API方法示例(此处未使用等待):
[HttpPost]
public async Task<IHttpActionResult> CalculateTest()
{
long d = 0;
for (long i = 0; i < 2000000000; i++)
{
d = i;
}
string returnVal = d.ToString();
return Ok(returnVal);
}
致电代码:
$('#btn1').click(function () {
console.log('Ajax request');
$.ajax({
url: 'http://localhost:53312/api/Measures/CalculateTest',
type: 'POST',
success: function (data) {
$('#result1').html('async request finished');
}
})
});
答案 0 :(得分:4)
在Web应用程序端点(API端点,控制器操作等)的上下文中,不必将其视为&#34;不阻止UI&#34;。相反,将其视为&#34;不要占用Web服务器线程&#34;。考虑使用磁盘或其他系统执行某些I / O的Web服务。通过使这些I / O操作异步,Web服务器可以在调用这些I / O操作时自由接收/处理更多请求。
你几乎总是等待异步操作。只有当你真正知道自己在做什么时,你才不会这样做。当你的代码在这里激发某些东西时,它会做什么来确保操作完成后再转到下一行代码。这可能是一件好事。特别是如果下一行代码需要由异步操作执行的操作。
如果您的控制器或API方法在内部调用异步操作,请等待它们。如果它没有调用任何,那么它本身并不需要异步。
*注意:很多时候,人们会经常天真地等待异步操作,因为他们希望它能够“发射并忘记”#34;。请记住&#34;忘记&#34;部分原因。 &#34;忘记&#34;意味着&#34;我不在乎这项行动是否成功。&#34;
有时可能没问题。大部分时间都不是。如果要确保操作结果,请等待它。让顶级应用程序层担心UI。
答案 1 :(得分:0)
我试图在没有技术的情况下做出这种区分。基本上,如果你关心的是返回值是什么......等待。否则......你的电话。但没有等待它只是一项任务。
例如,我编写了一个计算税收的函数,没有等待,我没有返回值,因此失败了。等待(这不是唯一的方法),我回答说.25 如果你仍然被困住,请告诉我。