抱歉,如果这个问题已经在某处得到解决,但它对该主题的资源量是相当压倒性的。
我写了以下方法,在异步调用上等待
public async Task GetAllObjectsNames(string bucketName)
{
if (string.IsNullOrEmpty(bucketName))
{
throw new ArgumentNullException(nameof(bucketName), "bucket name can't be null or empty string");
}
var request = new ListObjectsRequest
{
BucketName = bucketName
};
await s_client.ListObjectsAsync(request);
}
努力思考归还Task
和归还Task<T>
之间的区别
public async Task<IEnumerable<string>> GetAllObjectsNames(string bucketName)
{
if (string.IsNullOrEmpty(bucketName))
{
throw new ArgumentNullException(nameof(bucketName), "bucket name can't be null or empty string");
}
var request = new ListObjectsRequest
{
BucketName = bucketName
};
var response = await s_client.ListObjectsAsync(request);
return response.S3Objects.Select(o => o.Key);
}
有人可以插话吗?
>Task
表示可能正在进行或可能已取消、出错或已完成的操作。已完成的Task
不包含任何类型的结果,它仅表示操作已完成的事实。
Task<T>
还表示可能正在进行、可能已取消、出错或可能已完成的操作。但是,已完成的Task<T>
将包含该操作的结果,然后您可以读取该结果。
你可以写:
public async Task<IEnumerable<string>> GetAllObjectsNames(string bucketName)
// ...
var objects = await GetAllObjectsNames("Foo");
await GetAllObjectsNames("Foo"); // Throws away the result of the Task
但是您只能编写:
public async Task GetAllObjectsNames(string bucketName)
// ...
await GetAllObjectsNames("Foo");
从此版本的GetAllObjectsNames
返回的Task
不能包含结果,因此您只能知道该操作何时完成 - 您无法从中获取结果。
您可以使用Task
作为UploadObject
方法的返回值 - 您关心上传操作何时完成,但没有结果供您读取。您可能会使用Task<T>
表示GetAllObjectsNames
,因为该操作的目的是获取一些值供您使用。
从概念上讲,它与返回void
的方法(不返回结果(或返回其他任何内容的方法之间的区别相同。或者Action
和Func<T>
之间的区别.
System.Threading.Tasks.Task<TResult>
表示可以返回值(类型为 TResult(的异步操作。
(如果有帮助,这类似于System.Func<…, TResult>
,这基本上是一个返回值的操作(。
System.Threading.Tasks.Task
表示异步操作(不返回值(。
(同样,这类似于System.Action<…>
。