[英]How to use await, async and Task in asynchronous programming
這是我第一次編寫任何異步代碼。 我收到一個編譯錯誤,上面寫着:
無法將類型 void 隱式轉換為 int
而 function 正在返回一個int
。
public class Function
{
IAmazonS3 s3client = new AmazonS3Client(RegionEndpoint.USEast1);
public async Task<int> ListS3ObjectsAsync(string bucketName, IAmazonS3 client)
{
ListObjectsRequest request = new ListObjectsRequest();
request.BucketName = bucketName;
ListObjectsResponse response = await client.ListObjectsAsync(request);
do
{
if (response.IsTruncated)
request.Marker = response.NextMarker;
else
request = null;
} while (request != null);
var len = response.S3Objects.Count;
return len;
}
public void FunctionHandler(S3Event evnt, ILambdaContext context)
{
// Here I'm getting the compile error
int x = ListS3ObjectsAsync(evnt.Records?[0].S3.Bucket.Name, s3client).Wait();
}
}
視覺工作室截圖:
因為ListS3ObjectsAsync
方法返回一個Task<int>
,這是獲取int
的異步表示,所以為了獲得結果,您需要像這樣等待任務:
int x = await ListS3ObjectsAsync
但這將要求您也使 FunctionHandler 異步。
或者你可以在這樣的任務上調用.Result
var task = ListS3ObjectsAsync
int x = task.Result
請注意,這是一個阻塞操作,混合異步和非異步代碼是不好的做法。
.Wait
方法只等待任務完成,不返回Result
您不應該阻塞async
代碼,因此最好的解決方案是使用await
而不是Wait
:
public void FunctionHandler(S3Event evnt, ILambdaContext context)
{
int x = await ListS3ObjectsAsync(evnt.Records?[0].S3.Bucket.Name, s3client);
}
然后編譯器將告訴您解決方案的下一部分:必須將FunctionHandler
設為async
,並將其返回類型更改為Task
,即:
public async Task FunctionHandlerAsync(S3Event evnt, ILambdaContext context)
{
int x = await ListS3ObjectsAsync(evnt.Records?[0].S3.Bucket.Name, s3client);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.