将任务与任务理解<T>为返回类型



抱歉,如果这个问题已经在某处得到解决,但它对该主题的资源量是相当压倒性的。

我写了以下方法,在异步调用上等待

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的方法(不返回结果(或返回其他任何内容的方法之间的区别相同。或者ActionFunc<T>之间的区别.

System.Threading.Tasks.Task<TResult>表示可以返回值(类型为 TResult(的异步操作。

(如果有帮助,这类似于System.Func<…, TResult>,这基本上是一个返回值的操作(。

System.Threading.Tasks.Task表示异步操作(不返回值(。

(同样,这类似于System.Action<…>

最新更新