We have different long procedures with success and non-success results. We want to run this tasks in parallel, and return to user first success result. Stopping of other tasks would be great too.
I've tried Task.WhenAny and Parallel.ForEach approaches. The first one can't really check success. The second one doing a lot of extra work.
My snippets are here:
public static class Program
{
public static void Main(string[] args)
{
//FirstTry().Wait();
SecondTry().Wait();
}
public static async Task FirstTry()
{
var variants = Enumerable.Range(1, 20).ToList();
// first try
var tasks = variants.ConvertAll(async v => await LongProcedureTrueIfSuccess(v));
var completed = await Task.WhenAny(tasks);
var result = (await completed) ? "Good" : "Bad";
Console.WriteLine("Result is " + result);
}
public static async Task SecondTry()
{
var variants = Enumerable.Range(1, 20).ToList();
CancellationTokenSource cts = new CancellationTokenSource();
ConcurrentBag<bool> bag = new ConcurrentBag<bool>();
Parallel.ForEach(variants, (v,state) =>
{
var r = LongProcedureTrueIfSuccess(v).Result;
if (r)
{
bag.Add(r);
state.Stop();
}
});
var result = (bag.FirstOrDefault()) ? "Good" : "Bad";
Console.WriteLine("Result is " + result);
}
public static async Task<bool> LongProcedureTrueIfSuccess(int i)
{
await Task.Delay(1000); //Processing
Console.WriteLine("We know result");
if (i == 5)
return true;
return false;
}
}
https://dotnetfiddle.net/Imrrto
The best expected result is:
We know result
Result is Good
But we have
We know result
Result is Bad
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
in first case and
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
We know result
Result is Good
in second