簡體   English   中英

使用等待方法的返回值

[英]Using return value from awaited method

我試圖理解async方法和await ,我有這個簡單的例子:

using (var client = new AmazonSQSClient())
{
    var sqsRequest = new SendMessageRequest()
    {
        MessageBody = JsonConvert.SerializeObject(callProcessingRequest),
        QueueUrl = "https://sqs.eu-west-2.amazonaws.com/*****6014/W*****g"
    };

    LoggingHelper.Log(LoggingLevel.INFO, "Calling SQS", context);

    var sqsResponse = await client.SendMessageAsync(sqsRequest);

    LoggingHelper.Log(LoggingLevel.DEBUG,
        JsonConvert.SerializeObject(sqsResponse), context)
}

當我運行它時, sqsResponse的記錄永遠不會發生,但是如果我改變

var sqsResponse = await client.SendMessageAsync(sqsRequest);

var sqsResponse = client.SendMessageAsync(sqsRequest).Result;

然后它按預期工作。

由於它是一種async方法,我想我應該對它使用await ,但不確定為什么它不起作用。

編輯:按要求的整個方法。 添加.ConfigureAwait(false)沒有幫助。

public static async Task ProcessOutstandingDialplanItems()
{
    var context = new Context() { CurrentHandler = "PBXCallbacksLambdaFunction" };

    var callProcessingRequest = new CallProcessingRequest()
    {
        context = context,
        MethodToInvoke = "ProcessOutstandingDialPlanItems"
    };

    try
    {
        using (var client = new AmazonSQSClient())
        {
            var sqsRequest = new SendMessageRequest()
            {
                MessageBody = JsonConvert.SerializeObject(callProcessingRequest),
                QueueUrl = "https://sqs.eu-west-2.amazonaws.com/XXX6014/WXXXg"
            };

            LambdaLogger.Log("Calling SQS");

            var sqsResponse = await client.SendMessageAsync(sqsRequest)
                .ConfigureAwait(false);
            //var sqsResponse = client.SendMessageAsync(sqsRequest).Result;

            LambdaLogger.Log(JsonConvert.SerializeObject(sqsResponse));
        }
    }
    catch (Exception x)
    {
        LambdaLogger.Log(x.Message);
    }   
}

來自AWS 日志 .NET

AWS Lambda

這些包在隊列中批量記錄消息,並使用后台線程將消息發送到 CloudWatch Logs。 使用后台線程意味着在 AWS Lambda 中使用時不能保證消息被傳遞 原因是一旦 Lambda 事件被處理,后台線程將被凍結,如果一段時間內沒有收到更多 Lambda 事件,后台線程可能永遠不會解凍。

使用 Lambda 時,建議使用 ILambdaContext.Logger.LogLine 或 Amazon.Lambda.Logging.AspNetCore package。

我的猜測是,您已經在具有SynchronizationContext的應用程序(經典 ASP.NET、UI 應用程序,如 WPF、WinForms 等)中的一種方法中使用了ResultWait (或調用您的代碼的東西)。 這是陷入僵局的“好”方式。 您可以嘗試一件事 - 將ConfigureAwait(false)添加到調用中:

var sqsResponse = await client.SendMessageAsync(sqsRequest).ConfigureAwait(false);

但更好的做法是—— 不要阻塞異步代碼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM