How would I structure the code below so that the async method gets invoked?
Parallel.For(0, elevations.Count(), delegate(int i)
{
allSheets.AddRange(await BuildSheetsAsync(userID, elevations[i], includeLabels));
});
How would I structure the code below so that the async method gets invoked?
Parallel.For(0, elevations.Count(), delegate(int i)
{
allSheets.AddRange(await BuildSheetsAsync(userID, elevations[i], includeLabels));
});
Parallel.For()
doesn't work well withasync
methods. If you don't need to limit the degree of parallelism (i.e. you're okay with all of the tasks executing at the same time), you can simply start all theTask
s and then wait for them to complete:The easiest way to invoke your async method inside
Parallel.For
is next:==============
MarioDS mentioned absolutely right in the comment that in that case you may have unobserved exceptions. And this is definitely very important thing which you should always take in mind then have a deal with async delegates.
In this case if you think that you will have exceptions you can use
try/catch
block inside delegate. Or in some cases if your situation is good for it you can subscribe on TaskScheduler.UnobservedTaskException event.I'd recommend you to take a look at this question I asked a few days ago and ended-up answering myself, basically I was looking for a parallel and asynchronous ForEach method.
The method uses
SemaphoreSlim
to process things in parallel and it accepts asynchronous methods as an input action.You might also want to take a look at the two links I have provided at the end of my answer, they have been really helpful for realizing such behavior and they also contain another way of doing this using a
Partitioner
instead.Personally, I didn't like the
Parallel.For
because it's a synchronous call as explained in the links I've given; I wanted it all 'async' :-)Here it is : Asynchronously and parallelly downloading files