【问题标题】:how to wait for an async call in azure function如何在天蓝色函数中等待异步调用
【发布时间】:2018-11-04 07:13:11
【问题描述】:

我正在尝试从 Azure 函数调用 face api 异步方法。我正在等待异步方法,但 Azure 函数关闭并完成它。如何在 Azure 函数中等待异步操作完成?

这是我的代码(我使用的是 VS 2017,.Net 标准 2.0):

public static class IdentifyHttp
{
    [FunctionName("IdentifyHttp")]
    public static IActionResult Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");


        string url = new StreamReader(req.Body).ReadToEnd();            

        //string url = req.Query["url"];

        Stream rtn = null;
        HttpWebRequest aRequest = (HttpWebRequest)WebRequest.Create(url);
        HttpWebResponse aResponse = (HttpWebResponse)aRequest.GetResponse();

        StreamReader sReader = new StreamReader(aResponse.GetResponseStream(), System.Text.Encoding.Default);

            rtn = sReader.BaseStream;           

        AnalyzeImageFaceAPIAsync(rtn);

        return url != null
            ? (ActionResult)new OkObjectResult($"Hello, {url}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }

    private static async void AnalyzeImageFaceAPIAsync(Stream s)
    {

        string PersonGroupId = "employees";
        FaceServiceClient FaceServiceAPIClient = new FaceServiceClient("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "https://eastus.api.cognitive.microsoft.com/face/v1.0");
        string name = "No one identified";

        //s.Seek(0, SeekOrigin.Begin);
        var faces = await FaceServiceAPIClient.DetectAsync(s);
        var faceIds = faces.Select(face => face.FaceId).ToArray();

        var results = await FaceServiceAPIClient.IdentifyAsync(PersonGroupId, faceIds);
        foreach (var identifyResult in results)
        {
            if (identifyResult.Candidates.Length > 0)
            {
                var candidateId = identifyResult.Candidates[0].PersonId;
                var person = await FaceServiceAPIClient.GetPersonAsync(PersonGroupId, candidateId);
                name = person.Name;


            }
        }
    }
}

【问题讨论】:

  • public static async <IActionResult> Run 用于主函数签名。 private static async Task AnalyzeImageFaceAPIAsync 用于您的方法签名,await AnalyzeImageFaceAPIAsync(rtn); 在您的函数内

标签: azure-functions azure-function-async


【解决方案1】:

您应该使用async Task AnalyzeImageFaceAPIAsync 而不是async void AnalyzeImageFaceAPIAsync 来声明函数。如果AnalyzeImageFaceAPIAsync 中出现任何错误,它们不会填充到您的主函数中,您必须等待您自己的函数:await AnalyzeImageFaceAPIAsync(rtn);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-09-29
    • 1970-01-01
    • 2023-04-03
    • 2023-01-27
    相关资源
    最近更新 更多