Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# 5.0 async await return a list

I'm learning about async/await, and ran into a situation where I need to call an async method that should return an object or list of same object.
Is this the right way to implement ?

from AManager.cs

public async Task Initialize(string objectPath)
{
    AnObject someObject = await BClass.GetAnObject(objectPath);
}

and this is the called method

Class B:
public async Task<AnObject> GetAnObject(string objectPath)
{
    AnObject someObj = new AnObject();
    return someObj;
}

What happens if I want to return a list of object ? I should create a wrapper that contains a list ? and return that wrapper ?
Because this is not applicable:

public async Task<List<AnObject>> GetAnObject(string objectPath)
like image 216
ilansch Avatar asked Mar 12 '13 07:03

ilansch


2 Answers

To be able to run method as async you need to have await inside. If you won't have it it'll be run as synchronous method. That's probably why it did not work for you. To achieve this you can do something like this:

public async Task<List<string>> GetList()
{
    return await Task.Run(() => new List<string>() {"a", "b"});
}

And then to run it:

var list = await GetList()
like image 193
mariozski Avatar answered Oct 20 '22 03:10

mariozski


I am not sure what you are trying accomplish that the Task<List<AnObject>> is not applicable, but here is another example of returning a List of the AnObject in your example above

public class AnObject()
{
    SomeProperty {get; set;}
    Some Method(); 
}

public class theCollectionofAnObject : IList<AnObject> ()
{
    private List<AnObject> _contents = new List<AnObject>;

    //Implement the rest of IList interface

}

//Your async method
public Task<theCollectionofAnObject> GetAnObjects(parameter)
{
}
like image 2
TaraW Avatar answered Oct 20 '22 01:10

TaraW