繁体   English   中英

了解任务与任务 <T> 作为返回类型

[英]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 (不返回结果)的方法或返回其他任何值的方法之间的区别相同。 ActionFunc<T>之间的区别。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM