1. Task (Task里面的线程是来自于线程池!)
//Task线程来自线程池
ThreadPool.SetMaxThreads(10, 10);
List<int> list = new List<int>();
List<Task> taskList = new List<Task>();
for (int i = 0; i < 20; i++)
{
int k = i;
taskList.Add(Task.Run(() =>
{
list.Add(Thread.CurrentThread.ManagedThreadId);
Console.WriteLine($"***k={k} ThreadId={Thread.CurrentThread.ManagedThreadId.ToString("00")} ***");
}));
}
Task.WaitAll(taskList.ToArray());
Console.WriteLine($"最大线程数是:{list.Distinct().Count()}");
2. Sleep 和 Delay
Thread.Sleep(2000); //将当前线程挂起指定的毫秒数。阻塞
Task.Delay(2000); //创建将在时间延迟后完成的任务。不阻塞
3. WaitAll 和 WaitAny
Task.WaitAll(): 等待所有子线程执行完毕后,再往后执行,阻塞主线程(卡顿界面).
Task.WaitAny(): 等待任意一个线程执行完毕后,再往后执行,阻塞主线程(卡顿界面).
4. ContinueWhenAll 和 ContinueWhenAny
TaskFactory taskFactory = new TaskFactory();
//创建一个延续任务,该任务在一组指定的任务完成后开始。
taskFactory.ContinueWhenAll(tasks.ToArray(), a=> { Console.WriteLine("ContinueWhenAll"); }) ;
//创建一个延续 System.Threading.Tasks.Task,它将在提供的组中的任何任务完成后马上开始。
taskFactory.ContinueWhenAny(tasks.ToArray(), a=> { Console.WriteLine("ContinueWhenAll"); }) ;
5.
To Be Continue...