[英]How do I wait for the callback to finish before I return the value?
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?
}
I want to return the objectList field after the callback has finished in ListObjectsV2Async method.我想在 ListObjectsV2Async 方法中的回调完成后返回 objectList 字段。 However, this method runs asynchronously so if I just returns the list, it will return an empty list.
但是,此方法异步运行,因此如果我只返回列表,它将返回一个空列表。 So how do I wait until the callback added all the object into the list before i returns?
那么我如何等到回调将所有对象添加到列表中后再返回?
A TaskCompletionSource
can be used to capture the result of the callback, allowing for the method to be awaitable. TaskCompletionSource
可用于捕获回调的结果,允许方法等待。
For example例如
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;
}
Which now allows the现在允许
List<S3Object> objectList = await myClient.ListObjectsAsync("bucket_name_here", "identityId_here");
If you're sure you don't want to do the operation asynchronously, then why call the asynchronous version?如果您确定不想异步执行操作,那为什么要调用异步版本呢? Use
ListObjectsV2
instead:改用
ListObjectsV2
:
public List<S3Object> ListObjects(string bucketname, string identityId)
{
List<S3Object> objectList = new List<S3Object>();
var request = new ListObjectsV2Request()
{
BucketName = bucket_name,
Prefix = identityId
};
ListObjectsV2Response responseObject = Client.ListObjectsV2(request);
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;
}
However, I would recommend re-engineering so that ListObjects
returns void, takes one or more Action<List<S3Object>>
arguments, and you invoke the appropriate action in the callback:但是,我建议重新设计,以便
ListObjects
返回 void,采用一个或多个Action<List<S3Object>>
参数,然后在回调中调用适当的操作:
public void ListObjects(string bucketname, string identityId,
Action<List<S3Object>> callbackSuccess, Action callbackFailure)
{
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);
});
callbackSuccess.Invoke(objectList);
}
else
{
Debug.Log(responseObject.Exception);
callbackFailure.Invoke();
}
});
}
Then, where ListObjects
is called, you can enclose any local variables you need in the handlers.然后,在调用
ListObjects
地方,您可以在处理程序中包含您需要的任何局部变量。 Something like:就像是:
int localVar1 = 123;
float localVar2 = 4.56f;
Action<List<S3Object>> handleSuccess = (resultList) =>
{
DoStuffWithList(resultList, localVar1, localVar2);
};
Action handleFailure = () =>
{
DoStuffWhenFail(localVar1);
};
s3Client.ListObjects("foo", "bar", handleSuccess, handleFailure);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.