了解 Task 与 Task<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);

}

致力于解决返回 aTask和返回 a之间的区别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);

}

有人可以插话吗?


九州编程
浏览 88回答 2
2回答

慕无忌1623718

Task表示可能正在进行、或者可能已取消、发生故障或已完成的操作。CompletedTask不包含任何类型的结果,它仅表示操作已完成的事实。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");Task此版本的返回值不能GetAllObjectsNames包含结果,因此您只能知道该操作何时完成 - 您无法从中获取结果。您可以用作方法Task的返回值UploadObject- 您关心上传操作何时完成,但没有结果可供您读取。您可能会使用Task<T>for GetAllObjectsNames,因为该操作的目的是获取一些值供您使用。void从概念上讲,它与返回(不返回结果)的方法或返回其他任何内容的方法之间的区别相同。Action或者和之间的区别Func<T>。

慕桂英546537

System.Threading.Tasks.Task<TResult>表示可以返回值(类型为 TResult)的异步操作。(如果有帮助,这类似于System.Func<…, TResult>,它基本上是一个返回值的操作)。System.Threading.Tasks.Task表示异步操作(不返回值)。(同样,这类似于System.Action<…>。)
打开App,查看更多内容
随时随地看视频慕课网APP