I can solve this in .Net 4.5 but I must solve it in .Net 4.0, and so far i have not been successful.
I have not been able to get my replies into a Task<List<MyDataObject>>. The code below can create List<MyDataObject>.
public Task<List<MyDataObject>> Foo()
{
IEnumerable<string> names = GetList();
var tasks = new List<Task>();
foreach (var name in names)
{ tasks.Add(Task<MyDataObject>.Factory.StartNew(
() =>
{
var reply = new MyDataObject();
var workerObject = new WorkerObject();
workerObject.Foo2();
reply.Success = true;
return reply;
}));
}
Task.WaitAll(tasks.ToArray());
var replyList = new List<MyDataObject>();
for (int i = 0; i < tasks.Count(); i++)
{ replyList.Add(((Task<MyDataObject>)tasks[i]).Result);
}
return replyList;
}
WhenAll() is 4.5 only
await is 4.5 only
so i cannot accept those
I agree that this doesnt compile. What I showed was i can iterate through the results. However I do not know how to go from
List<MyDataObject>()
to
Task<List<MyDataObject>>
Thank you for the replies. I am going to accept Yuval Itzchakov's answer because it solves my problem in a simple manner. I am limited to no new assemblies for this use case. I would have selected 280Z28's second option had I had another method that required this functionality.
Use a TaskCompletionSource<List<MyDataObject>>
Task.WaitAll(tasks.ToArray());
var replyList = new List<MyDataObject>();
for (int i = 0; i < tasks.Count(); i++)
{
replyList.Add(((Task<MyDataObject>)tasks[i]).Result);
}
var tcs = new TaskCompletionSource<List<MyDataObject>>();
tcs.SetResult(replyList);
return tcs.Task;
You can also download Microsoft.Bcl.Async to get the
NET 4.5 effect in .NET 4.0
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