首页 > 解决方案 > 如何在返回值之前等待回调完成?

问题描述

public List<S3Object> ListObjects(string bucketname, string identityId)
{
    List<S3Object> objectList = new List<S3Object>();

    var request = new ListObjectsV2Request()
    {
        BucketName = bucket_name,
        Prefix = identityId
    };

    Client.ListObjectsV2Async(request, (responseObject) =>
    {
        if (responseObject.Exception == null)
        {
            List<S3Object> list = new List<S3Object>();
            responseObject.Response.S3Objects.ForEach((o) =>
            {
                objectList.Add(o);
            });
        }
        else
        {
            Debug.Log(responseObject.Exception);
        }
    });
    //return objectList;         

    // return the object after the callback is finished, e.g. added all the objects into objectList;
    // ListObjectsV2Async method returns void, so it is not possible to use async and await. i guess?
}

我想在 ListObjectsV2Async 方法中的回调完成后返回 objectList 字段。但是,这个方法是异步运行的,所以如果我只返回列表,它将返回一个空列表。那么如何等到回调将所有对象添加到列表中才返回呢?

标签: c#unity3damazon-s3

解决方案


ATaskCompletionSource可用于捕获回调的结果,从而使方法可以等待。

例如

public Task<List<S3Object>> ListObjectsAsync(string bucket_name, string identityId) {
    TaskCompletionSource<List<S3Object>> tcs = new TaskCompletionSource<List<S3Object>>();

    var request = new ListObjectsV2Request() {
        BucketName = bucket_name,
        Prefix = identityId
    };

    Client.ListObjectsV2Async(request, (responseObject) => {
        if (responseObject.Exception == null) {
            tcs.TrySetResult(responseObject.Response.S3Objects.ToList());
        } else {
            Debug.Log(responseObject.Exception);
            tcs.TrySetException(responseObject.Exception);
        }
    });

    // return the object after the callback is finished
    return tcs.Task;
}

现在允许

List<S3Object> objectList = await myClient.ListObjectsAsync("bucket_name_here", "identityId_here");

推荐阅读