I'm bit confused on how async/await can work as parallel so I made a test code here.
I try to send 6 task I simulated with a list.
Each of this task will execute 3 other subtask:
You can copy/paste for test.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//job simulation
Func<int, string, Tuple<int, string>> tc = Tuple.Create;
var input = new List<Tuple<int, string>>{
tc( 6000, "task 1" ),
tc( 5000, "task 2" ),
tc( 1000, "task 3" ),
tc( 1000, "task 4" ),
tc( 1000, "task 5" ),
tc( 1000, "task 6" )
};
List<Tuple<int, string>> JobsList = new List<Tuple<int, string>>(input);
//paralelism atempt
List<Task> TaskLauncher = new List<Task>();
Parallel.ForEach<Tuple<int, string>>(JobsList, item => JobDispatcher(item.Item1, item.Item2));
Console.ReadLine();
}
public static async Task JobDispatcher(int time , string query)
{
List<Task> TList = new List<Task>();
Task<string> T1 = SubTask1(time, query);
Task<string> T2 = SubTask2(time, query);
Task<string> T3 = SubTask3(time, query);
TList.Add(T1);
TList.Add(T2);
TList.Add(T3);
Console.WriteLine("{0} Launched ", query);
await Task.WhenAll(TList.ToArray());
Console.WriteLine(T1.Result);
Console.WriteLine(T2.Result);
Console.WriteLine(T3.Result);
}
public static async Task<string> SubTask1(int time, string query)
{
//somework
Thread.Sleep(time);
return query + "Finshed SubTask1";
}
public static async Task<string> SubTask2(int time, string query)
{
//somework
Thread.Sleep(time);
return query + "Finshed SubTask2";
}
public static async Task<string> SubTask3(int time, string query)
{
//somework
Thread.Sleep(time);
return query + "Finshed SubTask3";
}
}
}
Ideally at launch I should read:
task 1 launched
task 2 launched
task 3 launched
task 4 launched
task 5 launched
task 6 launched
Then at this point have all task running 6*3 = 18 thread running simultaneously, but it's not what happen here. Thing seem to execute synchronously.
Result is like:
What is the right way to write something that can launch task and subtask as 18 parallel thread with async/await?

async/awaitis about asynchrony (concurrency without threads);Parallelis about parallelism (concurrency by using more threads). These are completely different approaches to concurrency, and very very rarely do you need both. Perhaps if you describe what you're actually trying to do, we can suggest a more reasonable solution?