C#基礎(chǔ)–線程之Task
Task 是.NetFramework3.0出現(xiàn)的,Task里面的線程是來(lái)自于線程池
一、Task
1. 開(kāi)啟一個(gè)線程
Task 構(gòu)造函數(shù)
傳入一個(gè)無(wú)參數(shù)的 Action 委托作為參數(shù)
Task task = new Task(() =>
{
this.DoSomethingLong("btntask_Click1");
});
task.Start();
Run() 靜態(tài)方法
//Run 為靜態(tài)方法
Task.Run(() =>
{
this.DoSomethingLong("btntask_Click2");
});
TaskFactory 工廠
TaskFactory taskFactory = new TaskFactory();
taskFactory.StartNew(() =>
{
this.DoSomethingLong("btntask_Click3");
});
TaskFactory taskFactory = Task.Factory;
taskFactory.StartNew(() =>
{
this.DoSomethingLong("btntask_Click3");
});
Task.Delay 延遲執(zhí)行
Task.Delay 出現(xiàn)于4.5版本
Thread.Sleep() 是阻塞的,而 Delay 是非阻塞的;如果Sleep 和Delay 平級(jí),則會(huì)因Sleep造成阻塞(卡界面)
ContinueWith 類(lèi)似于回調(diào)
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//任務(wù)在2000ms=2s 以后執(zhí)行
Task task = Task.Delay(2000).ContinueWith(t =>
{
Console.WriteLine($"之前花費(fèi)時(shí)間:{stopwatch.ElapsedMilliseconds}");
Console.WriteLine("回調(diào)已完成");
Thread.Sleep(2000);
Console.WriteLine($"之后花費(fèi)時(shí)間:{stopwatch.ElapsedMilliseconds}");
stopwatch.Stop();
});
2. 等待任務(wù)
2.1 WaitAny
阻塞式,當(dāng)前線程會(huì)等待任意任務(wù)結(jié)束,然后才能執(zhí)行后續(xù)語(yǔ)句
List<Task> tasksList = new List<Task>();
TaskFactory taskFactory = new TaskFactory();
tasksList.Add(taskFactory.StartNew(() => { this.Coding("杰克", "系統(tǒng)管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("流光易逝", "部門(mén)管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("偏執(zhí)", "客戶(hù)管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("清茶", "接口管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("秋陌", "寫(xiě)Api"); }));
//如果有一個(gè)同學(xué)完成了某一個(gè)模塊,老師就需要準(zhǔn)備環(huán)境!
//等待某一個(gè)線程執(zhí)行完畢以后 繼續(xù)往后執(zhí)行
Task.WaitAny(tasksList.ToArray());
Console.WriteLine("Richard老師開(kāi)始準(zhǔn)備環(huán)境部署項(xiàng)目!");
2.2 WaitAll
阻塞式,當(dāng)前線程會(huì)等待所有任務(wù)結(jié)束,然后才能執(zhí)行后續(xù)語(yǔ)句
List<Task> tasksList = new List<Task>();
TaskFactory taskFactory = new TaskFactory();
tasksList.Add(taskFactory.StartNew(() => { this.Coding("杰克", "系統(tǒng)管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("流光易逝", "部門(mén)管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("偏執(zhí)", "客戶(hù)管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("清茶", "接口管理"); }));
tasksList.Add(taskFactory.StartNew(() => { this.Coding("秋陌", "寫(xiě)Api"); }));
//Richard老師要等待大家都完成了以后,開(kāi)始給點(diǎn)評(píng)!
Task.WaitAll(tasksList.ToArray()); //阻塞主線程
Console.WriteLine("5個(gè)模塊均已完成,Richard老師點(diǎn)評(píng)!");
2.3 WhenAny
非阻塞式,當(dāng)前線程會(huì)返回一個(gè)新的任務(wù),在該任務(wù)中等待任意任務(wù)結(jié)束,因此當(dāng)前線程不會(huì)阻塞
static int TaskMethod(string name, int seconds)
{
Console.WriteLine("Task {0} 運(yùn)行在線程 {1} 上。是否是線程池線程: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(TimeSpan.FromSeconds(seconds));
return 42 * seconds;
}
var tasks = new List<Task<int>>();
for (int i = 1; i < 4; i++)
{
int counter = i;
var task = new Task<int>(() => TaskMethod(string.Format("Task {0}", counter), counter));
tasks.Add(task);
task.Start();
}
while (tasks.Count > 0)
{
var completedTask = Task.WhenAny(tasks).Result;//這里的Result是指代Task<int>!
tasks.Remove(completedTask);
Console.WriteLine("A task has been completed with result {0}.", completedTask.Result);
}
2.4 WhenAll
非阻塞式,當(dāng)前線程會(huì)返回一個(gè)新的任務(wù),在該任務(wù)中等待所有任務(wù)結(jié)束,因此當(dāng)前線程不會(huì)阻塞文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-589834.html
static int TaskMethod(string name, int seconds)
{
Console.WriteLine("Task {0} 運(yùn)行在線程 {1} 上。是否是線程池線程: {2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(TimeSpan.FromSeconds(seconds));
return 42 * seconds;
}
var firstTask = new Task<int>(() => TaskMethod("First Task", 3));
var secondTask = new Task<int>(() => TaskMethod("Second Task", 2));
var whenAllTask = Task.WhenAll(firstTask, secondTask);
whenAllTask.ContinueWith(t =>Console.WriteLine("The first answer is {0}, the second is {1}", t.Result[0], t.Result[1])
, TaskContinuationOptions.OnlyOnRanToCompletion
);
firstTask.Start();
secondTask.Start();
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-589834.html
到了這里,關(guān)于C#基礎(chǔ)--線程之Task的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!