<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
通過任務,可以指定在任務完成之後,應開始執行之後另一個特定任務。ContinueWith是Task根據其自身狀況,決定後續應該作何操作。也就是說,在執行完task後,會執行task.continuewith(XX)中的XX語句,但是是否執行、如何執行等需要看task的執行情況。例如:一個使用前一個任務的結果的新任務,如果前一個任務失敗了,這個任務就應執行一些清理工作。任務處理程式都不帶引數或者帶一個物件引數,而任務的連續處理方法都有一個Task型別的引數。
程式碼:
static int TaskMethod(string name, int seconds) { Console.WriteLine("Frist Task Method : Task {0} is running on a thread id: {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); Thread.Sleep(TimeSpan.FromSeconds(seconds)); return 60 * seconds; } static void Main(string[] args) { var FirstTask = new Task<int>(() => TaskMethod("Frist Task", 3)); FirstTask.ContinueWith(t => Console.WriteLine("Frist Task Result: {0}. Thread id: {1}, Is in Thred Pool: {2}", t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread), TaskContinuationOptions.OnlyOnRanToCompletion);//執行緒池執行緒 FirstTask.Start(); Console.ReadKey(); }
結果:
Start()和ContinueWith()的先後順序沒有關係,ContinueWith()會等待直到firstTask執行狀態達到 IsCompleted,因為TaskContinuationOptions中的OnlyOnRanToCompletion.必須指出的是,ContinueWith()中的引數是需要以Task為引數的,也就是firstTask作為引數被傳入,而且ContinueWith()執行線上程池中的執行緒中。我覺得比較重要的一點是:把ContinueWith()中的語句當做一塊新的語句塊,他們獨立於主執行緒。無論如何,他們都要被判斷,如果狀態(status)不滿足,那麼他們不執行;當指定了多個狀態,則使用合理的對應狀態。
程式碼:
class Program { static int TaskMethod(string name, int seconds) { Console.WriteLine("Task Method : Task {0} is running on a thread id: {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); Thread.Sleep(TimeSpan.FromSeconds(seconds)); return 60 * seconds; } static void Main(string[] args) { Console.WriteLine("Main Thread id {0}, Is in Thred Pool: {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); var firstTask = new Task<int>(() => TaskMethod("frist task", 3)); var secondTask = new Task<int>(() => TaskMethod("second task", 2)); firstTask.ContinueWith(t => Console.WriteLine("Result:Frist Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}", t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread), TaskContinuationOptions.OnlyOnRanToCompletion); firstTask.Start(); secondTask.Start(); Thread.Sleep(TimeSpan.FromSeconds(4)); //給予足夠時間,讓firstTask、secondTask及其後續操作執行完畢。 Task continuation = secondTask.ContinueWith(t => Console.WriteLine("Result:Second Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}", t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously); Console.ReadLine(); Console.ReadKey(); } }
結果:
這裡主執行緒休眠了足足4秒鐘,足以讓firstTask和secondTask兩個任務完成執行,而後,由於secondTask的後續除了接受OnlyOnRanToCompletion外,還接受ExecuteSynchronously。因此,後續執行中,由於主執行緒還沒有結束,因此 ExecuteSynchronously得到認可,故secondTask的後續是在主執行緒上執行。
程式碼:
class Program { static int TaskMethod(string name, int seconds) { Console.WriteLine("Task Method : Task {0} is running on a thread id: {1}. Is thread pool thread: {2}", name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); Thread.Sleep(TimeSpan.FromSeconds(seconds)); return 60 * seconds; } static void Main(string[] args) { Console.WriteLine("Main Thread id {0}, Is in Thred Pool: {1}", Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread); var firstTask = new Task<int>(() => TaskMethod("frist task", 3)); var secondTask = new Task<int>(() => TaskMethod("second task", 2)); firstTask.ContinueWith(t => Console.WriteLine("Result:Frist Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}", t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread), TaskContinuationOptions.OnlyOnRanToCompletion); firstTask.Start(); secondTask.Start(); //Thread.Sleep(TimeSpan.FromSeconds(4)); //給予足夠時間,讓firstTask、secondTask及其後續操作執行完畢。 Task continuation = secondTask.ContinueWith(t => Console.WriteLine("Result:Second Thread Result: {0}. Thread id: {1}, Is in Thred Pool: {2}", t.Result, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.ExecuteSynchronously); Console.ReadLine(); Console.ReadKey(); } }
結果:
然而,如果把4秒鐘的休眠註釋掉,那麼由於主執行緒很早就結束了,因此secondTask只能接受到OnlyOnRanToCompletion,因此還是執行線上程池中。
到此這篇關於C#連續任務Task.ContinueWith方法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45