[英]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 等)中的一種方法中使用了Result
或Wait
(或調用您的代碼的東西)。 這是陷入僵局的“好”方式。 您可以嘗試一件事 - 將ConfigureAwait(false)
添加到調用中:
var sqsResponse = await client.SendMessageAsync(sqsRequest).ConfigureAwait(false);
但更好的做法是—— 不要阻塞異步代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.