C#多線程之 Task

Task類是.NetFramework3.0提供的功能,是C#多線程系列的集大成者,提供了豐富的API
線程池是單例的,Task中的線程源於線程池

啓動線程

使用task啓動新線程有四種方式:

var task1 = new Task(() => Console.WriteLine("dosomething1"));
task1.Start();

var task2 = Task.Run(() => Console.WriteLine("dosomething2"));

var taskFactory1 = new TaskFactory();
taskFactory1.StartNew(() => Console.WriteLine("dosomething3"));

var taskFactory2 = Task.Factory;
taskFactory2.StartNew(() => Console.WriteLine("dosomething4"));

Note:
什麼時候使用多線程? 答:任務能併發的時候使用
多線程能幹嘛? 答:提升速度,優化用戶體驗

任務等待

場景:併發執行任務,等待任務結束再進行下一步操作
Task.WaitAll(),參數爲所有任務組成的數組,等待所有任務結束纔會執行下一步操作,會阻塞主進程
Task.WaitAny(),參數爲所有任務組成的數組,只要有一個任務執行完畢就會執行下一步操作,也會阻塞主進程

static void Coding(string name,string projectName)
{
    Console.WriteLine($"Coding Start,{name},{projectName}");
    for (int i = 0; i < 1_000_000_000; i++)
    {
        //
    }
    Console.WriteLine($"Coding End,{name},{projectName}");
}

var taskList = new List<Task>();
taskList.Add(Task.Factory.StartNew(() => Coding("Henry", "DBA")));
taskList.Add(Task.Factory.StartNew(() => Coding("Tom", "Client")));
taskList.Add(Task.Factory.StartNew(() => Coding("Jack", "Server")));
taskList.Add(Task.Factory.StartNew(() => Coding("Jasn", "WeChat")));

Task.WaitAll(taskList.ToArray());//等待所有併發任務完成,阻塞主線程
//Task.WaitAny(taskList.ToArray());//等待只要有一個任務完成就繼續向下執行
//Task.WaitAll(taskList.ToArray(), 1000);//等待1000ms

Task 非阻塞式回調

創建TaskFactory的實例,
ContinueWhenAll方法接收兩個參數,一個任務數組,一個回調委託,當所有任務執行完畢後,執行委託方法,不會阻塞進程,主進程不受影響
ContinueWhenAny方法接收兩個參數,一個任務數組,一個回調委託,當任意一個任務執行完畢後,執行委託方法,不會阻塞進程,主進程不受影響

var taskFactory = new TaskFactory();
var taskList = new List<Task>();
taskList.Add(taskFactory.StartNew(() => Coding("Henry", "DBA")));
taskList.Add(taskFactory.StartNew(() => Coding("Tom", "Client")));
taskList.Add(taskFactory.StartNew(() => Coding("Jack", "Server")));
taskList.Add(taskFactory.StartNew(() => Coding("Jasn", "WeChat")));

taskFactory.ContinueWhenAll(taskList.ToArray(), t => Console.WriteLine("do next things"));
taskFactory.ContinueWhenAny(taskList.ToArray(), t => Console.WriteLine("do next things"));

當前task回調

待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章