[英]Understanding Task vs Task<T> as a return type
抱歉,如果已在某处解决了该问题,但这在该主题上占用了大量资源。
我编写了以下等待异步调用的方法
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>
之间的区别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<…>
。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.