Apologies if this has been addressed somewhere, but it is quite overwhelming the amount of resources on the topic.
I wrote the following method that awaits on an async call
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);
}
Working on wrapping my head around the difference between returning a Task and returning 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);
}
Could someone chime in?
Task represents an operation which might be in progress, or might have been cancelled, faulted, or completed. A completed Task does not contain any sort of result, it just represents the fact that the operation has finished.
Task<T> also represents an operation which might be in progress, or might have been cancelled, faulted, or might have completed. However, a completed Task<T> will contain the result of that operation, which you can then read.
You can write:
public async Task<IEnumerable<string>> GetAllObjectsNames(string bucketName)
// ...
var objects = await GetAllObjectsNames("Foo");
await GetAllObjectsNames("Foo"); // Throws away the result of the Task
However you can only write:
public async Task GetAllObjectsNames(string bucketName)
// ...
await GetAllObjectsNames("Foo");
The Task returned from this version of GetAllObjectsNames cannot contain a result, so you can only tell when that operation has finished - you cannot get a result out of it.
You might use Task as the return value from an UploadObject method - where you care when the upload operation finishes, but there's no result for you to read. You would probably use Task<T> for GetAllObjectsNames, since the point of that operation is to fetch some values for you to then use.
Conceptually it's the same as the difference between a method which returns void (does not return a result), or a method which returns anything else. Or the difference between Action and Func<T>.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With