Sunday, June 2, 2019

C# async method returning multiple parameters

Overview


C# 7 now supports function and method that return multiple values.
The reasons why I like it are
  • Output parameter require more code to write and do not make the code easier to read
  • The other solution is to create a specific class that contains all the values. It is clean but require more code. 
  • The Python language had this feature for a long time based on the concept of Tuple. 
  • A previous version of C# introduced the concept of Tuple, but all the names had to be Item1, Item2.
In C# 7 there is a new Tuples concept. For more about it see link Tuples with C# 7.0.

Async Method


The more tricky question is how is this supposed to work with async method.

public async Task < ( DonationDTO donationDTO, string messageId ) > DequeueAsync()
{
    var m = await _queueManager.DequeueAsync();
    if(m == null)
    {
        return ( null, null );
    }
    else
    {
        base.TrackNewItem();
        var donationDTO = DonationDTO.FromJSON(m.AsString);

        return ( donationDTO, m.Id );
    }
}

// How to call the method - Solution 1
var result = await donationQueue.DequeueAsync();
var donationDTO = result.donationDTO;
var messageId = result.messageId;

// How to call the method - Solution 2
(DonationDTO donationDTO, string messageId) = await donationQueue.DequeueAsync();

No comments:

Post a Comment