国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

Task的一些用法總結(jié)

2019-11-14 16:14:41
字體:
供稿:網(wǎng)友

一、Task和多線程以及異常的捕獲示例代碼:

static void Main(string[] args)        {            // 產(chǎn)生CancellationToken的類,該類允許使用Cancel方法終止線程            // 也可以使用CancellationTokenSource.CreateLinkedTokenSource創(chuàng)建            // 一組相關(guān)的Token,任意一個取消都取消            CancellationTokenSource ts = new CancellationTokenSource();                        CancellationToken ct = ts.Token;            Task t = null;            t = new Task(() =>                          {                              for (int i = 1; i < 11; i++)                              {                                  // 調(diào)用Cancel方法,狀態(tài)為true(表示已經(jīng)取消了)                                  if (!ts.IsCancellationRequested)                                  {                                      if (i == 5)                                      {                                          // 該異常不會直接被主線程捕獲                                          throw new Exception("數(shù)字是5,非法!");                                      }                                  }                                  else                                  {                                      Console.WriteLine("用戶取消");                                      // 拋出異常,強制取消子線程                                      ct.ThrowIfCancellationRequested();                                  }                                  Console.WriteLine(i);                                  Thread.Sleep(500);                              }                          }, ct);            t.Start();            // 注冊Cancel之后的引發(fā)的事件,注意Exception也可以在這里捕獲            t.ContinueWith((task) =>            {                // 只有調(diào)用Cancel方法才會被設(shè)置為True                Console.WriteLine(t.IsCanceled);                // 無論何種情況,只要完成了就是True                Console.WriteLine(t.IsCompleted);                // 只要有異常,為True(哪怕是ThrowIfCancellationRequested異常)                Console.WriteLine(t.IsFaulted);                // 捕獲各種各樣的異常                foreach (var item in task.Exception.InnerExceptions)                {                    Console.WriteLine(item.Message);                }            });            Console.ReadLine();            // 取消任務(wù)            ts.Cancel();            Thread.Sleep(Timeout.Infinite);        }

結(jié)論:

1、無論任何異常都會終止子線程。

2、異常發(fā)生之后,只有在Task的Wait/WaitAll/WaitAny/Result或者Continue方法才可以捕獲異常,主線程不可能,因為是子線程中的異常。

二、Task的任務(wù)先后順序(允許嵌套任務(wù)),同時允許把線程掛接到主線程上執(zhí)行返回結(jié)果(避免以前Thread和WinForm控件交互時候發(fā)生的“不是由本線程創(chuàng)建的控件異常&hellip;…”問題):

static void Main(string[] args)        {            CancellationTokenSource cts = new CancellationTokenSource();            CancellationToken ct = cts.Token;            Task t = new Task(() =>            {                Console.WriteLine("主任務(wù)開始……,包含3個子任務(wù):");                Task.Factory.StartNew(() =>                {                    Thread.Sleep(2000);                    Console.WriteLine("任務(wù)一");                },                    // 掛接到主線程,這樣主線程會自動等待子線程完成后完成                    TaskCreationOptions.AttachedToParent );                Task.Factory.StartNew(() =>                {                    Thread.Sleep(500);                    Console.WriteLine("任務(wù)二");                }, TaskCreationOptions.AttachedToParent);                Task.Factory.StartNew(() =>                {                    Thread.Sleep(1000);                    Console.WriteLine("任務(wù)三");                },                    TaskCreationOptions.AttachedToParent);            }, ct);            t.ContinueWith((Task) =>            {                Console.WriteLine("子任務(wù)都完成,主任務(wù)結(jié)束。");                // 指定上下文的同步塊,防止跨線程訪問控件的問題(控制臺程序不能使用,WinForm啥可以)            },TaskScheduler.FromCurrentSynchronizationContext());            t.Start();            Thread.Sleep(Timeout.Infinite);        }

相比較原來的Wait而言,不會卡死子線程,而且又可以多任務(wù)運行。

欲想知道更多關(guān)于線程操作的東西,可以參考:

MSDN,并行處理系列篇:http://msdn.microsoft.com/zh-cn/library/vstudio/3e8s7xdd(v=vs.110).aspx


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 绥阳县| 湖州市| 鹿邑县| 郴州市| 齐河县| 织金县| 鹤壁市| 普格县| 娱乐| 临西县| 巴彦淖尔市| 芦山县| 共和县| 兴海县| 怀宁县| 柯坪县| 车险| 临猗县| 巧家县| 上杭县| 湄潭县| 昂仁县| 循化| 沾益县| 同仁县| 蓬安县| 合川市| 大荔县| 綦江县| 林口县| 历史| 揭阳市| 山西省| 中卫市| 德惠市| 平原县| 阳原县| 刚察县| 广河县| 永寿县| 武宁县|