I have a program with a async Task<Result>
method, than I need to run in parallel from a loop.
Here are two ways I tried, the first one (ResolveWidgetsTaskFactoryAsync) works as expected, but the other (ResolveWidgetsNotParallelAsync) runs synchronously, even if each method returns as Task.
While keeping async Task return type of ComputeAsync, how can I write better my parallel version ?
void Main()
{
var results = ResolveWidgetsTaskFactoryAsync().Result;
results.Dump();
results = ResolveWidgetsNotParallelAsync().Result;
results.Dump();
}
/// <summary>
/// Runs synchronously instead of in parallel
/// /summary>
private async Task<IEnumerable<string>> ResolveWidgetsNotParallelAsync()
{
var values = new() { "a", "b", "c" };
var widgets = new List<Task<string>>();
foreach (var value in values)
{
Console.WriteLine("Iteration value : " + value);
var widgetTask = ComputeAsync(value);
widgets.Add(widgetTask);
}
return await Task.WhenAll(widgets);
}
/// <summary>
/// Runs as expected, but I'm not sure it's well written
/// /summary>
private async Task<IEnumerable<string>> ResolveWidgetsTaskFactoryAsync()
{
var values = new () { "a", "b", "c" };
var widgets = new List<Task<string>>();
foreach (var value in values)
{
Console.WriteLine("Iteration value : " + value);
widgets.Add(Task<string>.Factory.StartNew(() => ComputeAsync(value).Result));
}
return await Task.WhenAll(widgets);
}
public async Task<string> ComputeAsync(string value)
{
try
{
Console.WriteLine("Processing value : " + value);
Random rnd = new Random();
var wait = rnd.Next(1000, 5000);
Console.WriteLine("Wait : " + wait);
Thread.Sleep(wait);
return await Task.FromResult(value + " done");
}
catch (Exception e)
{
return null;
}
}
Thank you