c# - 如何在返回值之前等待回调完成?
问题描述
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 字段。但是,这个方法是异步运行的,所以如果我只返回列表,它将返回一个空列表。那么如何等到回调将所有对象添加到列表中才返回呢?
解决方案
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");
推荐阅读
- java - 无法使用 Gradle (Buildship 1.x) 导入,因为未安装 Buildship Gradle Tooling 版本 1.x
- python - 如何在代码中的两个 python 安装之间切换
- dart - Flutter 在执行后台任务时显示进度 HUD
- xml - 需要找到两个特定子节点之间的子节点值
- sql - SQL:对多行求和/按问题分组
- javascript - Angular:需要解决一系列操作(可观察)
- ios - 从特定单元格获取开关状态
- react-native - 反应原生 webview 导航问题
- bash - 将浮点数传递给 BASH 中的函数
- vba - 复制/粘贴具有特定颜色 VBA 的单元格