[英]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.