国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

更多QQ空间微信QQ好友腾讯朋友复制链接
您的位置:首頁/技術文章
文章詳情頁

.Net中Task Parallel Library的基本用法

【字号: 作者:豬豬瀏覽:86日期:2022-06-08 16:47:04

我們知道,每個應用程序就是一個進程,一個進程有多個線程。Task Parallel Library為我們的異步編程、多線程編程提供了強有力的支持,它允許一個主線程運行的同時,另外的一些線程或Task也同時運行。本篇體驗基本用法。

基本用法

Taks的構造函數接收的類型是Action,也就是一個委托。

static void Main(string[] args){    var t1 = new Task(() =>    {Console.WriteLine("任務1開始");Thread.Sleep(1000);Console.WriteLine("任務1結束");    });    t1.Start();    Console.ReadKey();}

如果把方法放到外面。

static void Main(string[] args){    var t1 = new Task(() => DoSth(1,2000));    t1.Start();    Console.ReadKey();}static void DoSth(int id, int sleepTime){    Console.WriteLine("任務{0}開始",id);    Thread.Sleep(sleepTime);    Console.WriteLine("任務{0}結束",id);}

如果有多個Task同時執行。

static void Main(string[] args){    var t1 = new Task(() => DoSth(1,2000));    t1.Start();    var t2 = new Task(() => DoSth(2, 1500));    t2.Start();    var t3 = new Task(() => DoSth(3, 3000));    t3.Start();    Console.ReadKey();}

如果有很多Task,每個Task手動啟動的話很費事,Task Parallel Library為我們準備了Task工廠。

static void Main(string[] args){    var t1 = Task.Factory.StartNew(() => DoSth(1, 2000));    var t2 = Task.Factory.StartNew(() => DoSth(2, 1500));    var t3 = Task.Factory.StartNew(() => DoSth(3, 3000));    Console.ReadKey();}

如果我們想在一個任務結束之后立即執行某個任務,可以使用ContinueWith方法。

static void Main(string[] args){    var t1 = Task.Factory.StartNew(() => DoSth(1, 2000)).ContinueWith((pre)=> DoOtherThing(4,2000));     var t2 = Task.Factory.StartNew(() => DoSth(2, 1500));    var t3 = Task.Factory.StartNew(() => DoSth(3, 3000));    Console.ReadKey();}static void DoSth(int id, int sleepTime){    Console.WriteLine("任務{0}開始",id);    Thread.Sleep(sleepTime);    Console.WriteLine("任務{0}結束",id);}static void DoOtherThing(int id, int sleepTime){    Console.WriteLine("其他任務{0}開始", id);    Thread.Sleep(sleepTime);    Console.WriteLine("其他任務{0}結束", id);}

如果希望等待所有的Task執行完畢,使用WaitAll方法。

static void Main(string[] args){    var t1 = Task.Factory.StartNew(() => DoSth(1, 2000));    var t2 = Task.Factory.StartNew(() => DoSth(2, 1500));    var t3 = Task.Factory.StartNew(() => DoSth(3, 3000));    var taskList = new List<Task> {t1, t2, t3};    Task.WaitAll(taskList.ToArray());    Console.WriteLine("我是在所有Task執行完畢后才執行的");    Console.ReadKey();}

如果想手動取消結束某個Task,需要為方法帶上CancellationToken類型參數。

static void Main(string[] args){    var source = new CancellationTokenSource();    try    {var t1 =    Task.Factory.StartNew(() => DoSth(1, 1000, source.Token)).ContinueWith((pre) => DoOtherThing(2, 2000));source.Cancel();    }    catch (Exception ex)    {Console.WriteLine(ex.GetType());    }    Console.WriteLine("haha");    Console.ReadKey();}static void DoSth(int id, int sleepTime, CancellationToken token){    if (token.IsCancellationRequested)    {Console.WriteLine("任務被取消");token.ThrowIfCancellationRequested();    }        Console.WriteLine("任務{0}開始",id);    Thread.Sleep(sleepTime);    Console.WriteLine("任務{0}結束",id);}static void DoOtherThing(int id, int sleepTime){    Console.WriteLine("其他任務{0}開始", id);    Thread.Sleep(sleepTime);    Console.WriteLine("其他任務{0}結束", id);}

如何從Task從獲取方法的返回結果呢?

static void Main(string[] args){    Console.WriteLine("開始計算");    Task<int> t = Task.Factory.StartNew(() => Sum(1, 2));    Console.WriteLine("等待結果");    Console.WriteLine(t.Result);    Console.ReadKey();}static int Sum(int a, int b){    return a + b;}

后面一個Task獲取前面一個Task的返回值。

static void Main(string[] args){    Task<string> firstTask = Task.Factory.StartNew<string>(() =>    {Console.WriteLine("第一個任務開始");return "hi from the one";    });    Task secondTask = firstTask.ContinueWith((prevoursTask) =>    {Console.WriteLine("這里是第二個任務,獲取到第一個任務的返回值是{0}",prevoursTask.Result,TaskContinuationOptions.OnlyOnRanToCompletion);    });    secondTask.Wait();    Console.ReadKey();}

等待所有Task完成。

static void Main(string[] args){   var t1 =  Task.Factory.StartNew(() =>    {Console.WriteLine("第一個任務");Thread.Sleep(1000);    });    var t2 = Task.Factory.StartNew(() =>    {Console.WriteLine("第二個任務");Thread.Sleep(1000);    });    var taskList = new List<Task> {t1, t2};    Task.Factory.ContinueWhenAll(taskList.ToArray(), (t) => { Console.WriteLine("所有任務完成我就出來"); });    Console.ReadKey();}

如果是嵌套Task。

static void Main(string[] args){    Task.Factory.StartNew(() =>    {Task child = Task.Factory.StartNew(() =>{    Console.WriteLine("我是子任務");}, TaskCreationOptions.AttachedToParent);    }).Wait();    Console.ReadKey();}

啟動Task的幾種方式

1、通過Task.Factory.StartNew方法。

static void Main(string[] args){    Task.Factory.StartNew(() => SaySth("hello"));    Console.ReadKey();}static void SaySth(string msg){    Console.WriteLine(msg);}

2、通過Task的Start實例方法

static void Main(string[] args){    var t = new Task(() => SaySth("hello"));    t.Start();    Console.ReadKey();}

或者干脆用委托。

static void Main(string[] args){    Task t = new Task(delegate {SaySth("hello");});    t.Start();    Console.ReadKey();}

3、Task的靜態方法Run

static void Main(string[] args){    Task t = Task.Run(() => SaySth("hello"));    Console.ReadKey();}static void SaySth(string msg){    Console.WriteLine(msg);}  

一個例子

比如說要下載某個頁面,在保持當前UI界面無影響的情況下,使用Task在后臺啟動任務下載某個頁面。

static void Main(string[] args){    Console.WriteLine("界面內容");    Task<string> r = DownloadAsync("http://www.baidu.com");    while (!r.IsCompleted)    {Console.Write(".");Thread.Sleep(250);    }    Console.WriteLine(r.Result);    Console.ReadKey();}private static string DownloadWebPage(string url){    WebRequest request = WebRequest.Create(url);    WebResponse response = request.GetResponse();    var reader = new StreamReader(response.GetResponseStream());    return reader.ReadToEnd();}private static Task<string> DownloadAsync(string url){    return Task.Factory.StartNew(() => DownloadWebPage(url));}

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對的支持。如果你想了解更多相關內容請查看下面相關鏈接

標簽: ASP.NET
相關文章:
主站蜘蛛池模板: 国产成人综合亚洲一区 | 伊人久久精品午夜 | 偷看各类wc女厕嘘在线观看 | 国产成人久久精品激情91 | 日本免费人做人一区在线观看 | 另类女最新视频 | 亚洲精品午夜一区二区在线观看 | 精品欧美成人高清视频在线观看 | 日韩欧美~中文字幕 | 永久免费看毛片 | 成年女人看片免费视频频 | 国产伦精品一区二区三区免费 | 久久99精品视频在线在线观看 | 深夜福利视频在线观看 | 日韩 欧美 国产 师生 制服 | 五月久久亚洲七七综合中文网 | 精品国产美女福利到在线不卡 | 国产伦精品一区二区三区网站 | 综合欧美视频一区二区三区 | 欧美三级在线观看视频 | 日韩一级性生活片 | 可以看毛片的网站 | 国产男人天堂 | 亚洲精品国产成人专区 | 亚洲精品无码不卡 | 亚洲一区二区三区在线播放 | 天干天干天啪啪夜爽爽色 | 久久国产欧美 | 国产精品怡红院在线观看 | 黄色免费看片网站 | a亚洲天堂| 日韩欧美在线观看视频一区二区 | 精品久 | 国产爽的冒白浆的视频高清 | 国产精品_国产精品_国产精品 | 日韩黄色免费观看 | 欧美国产高清欧美 | 欧美日韩一区二区综合在线视频 | 波多野结衣在线免费视频 | 日本三级11k影院在线 | 三级全黄的全黄三级三级播放 |