在异步函数中需要等待的原因和时间?

时间:2018-05-18 20:21:00

标签: c# asynchronous async-await

我知道有类似的问题,但我正在努力解决.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');
                }
            })
        });

2 个答案:

答案 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 如果你仍然被困住,请告诉我。