繁体   English   中英

异步编程中如何使用await、async和Task

[英]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();
    }
}

视觉工作室截图:

Visual Studio 屏幕截图

因为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);
}

像这样async的“增长”是正常的

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM