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

您的位置:首頁技術(shù)文章
文章詳情頁

.Net中Task Parallel Library的進(jìn)階用法

瀏覽:103日期:2022-06-08 15:40:40

在前一篇中,了解了Task的基本用法

如果一個(gè)方法返回Task,Task<T>,如何獲取Task的返回值,獲取值的過程會(huì)阻塞線程嗎?

static void Main(string[] args){    var result = DoWorkAsync().Result;    Console.WriteLine(result);    Console.WriteLine("我會(huì)什么時(shí)候顯示");    Console.ReadKey();}static Task<string> DoWorkAsync(){    return Task<string>.Factory.StartNew(() =>    {Thread.Sleep(3000);return "hello";    });}

可見,Task的Result屬性可以獲取返回值,而且,獲取返回值的過程線程是被阻塞的。

是否可以不阻塞線程,又能拿到某個(gè)線程的返回值呢?ContinueWith方法在某個(gè)線程結(jié)束之后進(jìn)行,但同時(shí)不會(huì)阻塞線程。

static void Main(string[] args){    DoWorkAsync().ContinueWith((pre) =>    {Console.WriteLine(pre.Result);    });    Console.WriteLine("我會(huì)什么時(shí)候顯示");    Console.ReadKey();}

但ContinueWith總會(huì)在某個(gè)線程結(jié)束之后進(jìn)行,是否可以對(duì)ContinueWith的過程控制一下呢?

static void Main(string[] args){    DoWorkAsync().ContinueWith((pre) =>    {Console.WriteLine(pre.Result);    }, TaskContinuationOptions.NotOnFaulted);    DoWorkAsync().ContinueWith((pre) =>    {Console.WriteLine(pre.Exception);    },TaskContinuationOptions.OnlyOnFaulted);    Console.WriteLine("我會(huì)什么時(shí)候顯示");    Console.ReadKey();}

以上,當(dāng)沒有錯(cuò)誤的時(shí)候就把返回值顯示出來,有錯(cuò)誤就把錯(cuò)誤信息顯示出來。

還可以通過Task的實(shí)例方法IsCompleted來判斷一個(gè)線程是否完成。

static void Main(string[] args){    var doWorkTask = DoWorkAsync();    if (doWorkTask.IsCompleted)    {Console.WriteLine(doWorkTask.Result);    }    else    {doWorkTask.ContinueWith((pre) =>{    Console.WriteLine(pre.Result);}, TaskContinuationOptions.NotOnFaulted);doWorkTask.ContinueWith((pre) =>{    Console.WriteLine(pre.Exception);}, TaskContinuationOptions.OnlyOnFaulted);    }        Console.WriteLine("我會(huì)什么時(shí)候顯示");    Console.ReadKey();}

Task的Status屬性,以及結(jié)合TaskStatus枚舉,可以判斷Task的狀態(tài)。

static void Main(string[] args){    var httpClient = new HttpClient();    Task<string> baiduTask = httpClient.GetStringAsync("http://www.baidu.com");    var httpClient2 = new HttpClient();    Task<string> sinaTask = httpClient2.GetStringAsync("http://www.sina.com.cn");    //等上面2個(gè)任務(wù)完成時(shí)這里再開始    Task<string[]> task = Task.WhenAll(baiduTask, sinaTask);    task.ContinueWith(stringArray =>    {//如果任務(wù)完成if (task.Status == TaskStatus.RanToCompletion){    for (int i = 0; i < stringArray.Result.Length;i++)    {Console.WriteLine(stringArray.Result[i].Substring(0,100));    }}else if (task.Status == TaskStatus.Canceled) //如果被取消{    Console.WriteLine("{0}這個(gè)任務(wù)被取消了",task.Id);}else //發(fā)生錯(cuò)誤{    Console.WriteLine("發(fā)生錯(cuò)誤了~~");    foreach (var item in task.Exception.InnerExceptions)    {Console.WriteLine(item.Message);    }}    });    Console.ReadKey();}

如果要控制Task的生命周期,可以考慮使用TaskCompletionSource<T>。

       static void Main(string[] args){    AsyncFactory.GetIntAsync().ContinueWith((prev) =>    {if (prev.Status == TaskStatus.RanToCompletion){    Console.WriteLine(prev.Result);}else if (prev.Status == TaskStatus.Canceled){    Console.WriteLine("任務(wù)被取消");}else{    Console.WriteLine("發(fā)生錯(cuò)誤哦");    Console.WriteLine(prev.Exception);}    });    Console.ReadKey();}    }    public static class AsyncFactory    {public static Task<int> GetIntAsync(){    var tsc = new TaskCompletionSource<int>();    var timer = new System.Timers.Timer(2000);    timer.AutoReset = false;    timer.Elapsed += (s, e) =>    {tsc.SetResult(10);timer.Dispose();    };    timer.Start();    return tsc.Task;     }    }

以上,通過TaskCompletionSource<T>的SetResult給線程設(shè)置返回值,通過TaskCompletionSource<T>的.Task有獲取了線程。

另外,從.NET 4.5開始,Task的靜態(tài)方法FromResult,接收T類型,返回Task<T>。

static void Main(string[] args){    var intTask = GetIntAsync();    if (intTask.Status == TaskStatus.RanToCompletion)    {Console.WriteLine(intTask.Result);    }    else if (intTask.Status == TaskStatus.Canceled)    {Console.WriteLine("任務(wù)被取消");    }    else    {Console.WriteLine("發(fā)生錯(cuò)誤哦");Console.WriteLine(intTask.Exception);    }    Console.ReadKey();}static Task<int> GetIntAsync(){    return Task.FromResult(10);}

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

標(biāo)簽: ASP.NET
相關(guān)文章:
主站蜘蛛池模板: 成人高清无遮挡免费视频软件 | 99精品国产免费久久国语 | 亚洲综合美女 | 99精品99| 欧美一级毛片欧美一级无片 | 久久福利影视 | 国产欧美日韩成人 | 亚洲欧美国产一区二区三区 | 久久综久久美利坚合众国 | 精品久久久久中文字幕日本 | 久久在线播放 | 天天躁日日躁狠狠躁一级毛片 | 深夜做爰性大片很黄很色视频 | 日韩欧美亚洲国产 | 国产一区2区 | 免费视频成人国产精品网站 | 亚洲欧美综合一区二区三区四区 | 国产视频软件在线 | 狠狠色综合久久丁香婷婷 | 欧美一区二区三区不卡片 | 午夜丝袜美腿福利视频在线看 | 日韩欧美精品在线视频 | 日韩在线免费 | 欧美一区二区三区视频在线观看 | 69日本xxxxxxxxx13| 久久在线精品 | 欧美a免费| 国产在线播放不卡 | 国产成人免费视频 | 欧美黄a | 亚洲天堂男人在线 | 一级特级aaaa毛片免费观看 | 99精品福利| 毛片在线播放网址 | 亚洲天堂精品在线观看 | 麻豆日韩 | 成人欧美精品久久久久影院 | 亚洲精品一区二区三区美女 | 欧美日韩一区二区三区视频 | 久视频免费精品6 | 黄色理论视频 |