中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

網(wǎng)站建設(shè)宗旨怎么寫谷歌推廣效果怎么樣

網(wǎng)站建設(shè)宗旨怎么寫,谷歌推廣效果怎么樣,wordpress忘記以前版本,notepad做網(wǎng)站描述 Task出現(xiàn)之前,微軟的多線程處理方式有:Thread→ThreadPool→委托的異步調(diào)用,雖然可以滿足基本業(yè)務(wù)場景,但它們在多個線程的等待處理方面、資源占用方面、延續(xù)和阻塞方面都顯得比較笨拙,在面對復(fù)雜的業(yè)務(wù)場景下&am…

描述
Task出現(xiàn)之前,微軟的多線程處理方式有:Thread→ThreadPool→委托的異步調(diào)用,雖然可以滿足基本業(yè)務(wù)場景,但它們在多個線程的等待處理方面、資源占用方面、延續(xù)和阻塞方面都顯得比較笨拙,在面對復(fù)雜的業(yè)務(wù)場景下,顯得有點捉襟見肘
Task是微軟在.Net 4.0時代推出來的,也是微軟極力推薦的一種多線程的處理方式,Task看起來像一個Thread,實際上,它是在ThreadPool的基礎(chǔ)上進行的封裝
Task的控制和擴展性很強,在線程的延續(xù)、阻塞、取消、超時等方面遠勝于Thread和ThreadPool
Task可以簡單看作相當于Thead+TheadPool,其性能比直接使用Thread要更好,在工作中更多的是使用Task來處理多線程任務(wù)
任務(wù)Task和線程Thread的區(qū)別
Task是建立在Thread之上的,最終其實還是由Thread去執(zhí)行,它們都是在 System.Threading 命名空間下的
Task跟Thread并不是一對一的關(guān)系。比如說開啟10個任務(wù)并不一定會開啟10個線程,因為使用Task開啟新任務(wù)時,是從線程池中調(diào)用線程,這點與ThreadPool.QueueUserWorkItem類似

Task的使用


創(chuàng)建Task的三種方式

方式一:通過創(chuàng)建Task對象后調(diào)用其 Start()函數(shù)
方式二:調(diào)用Task的靜態(tài)方法Run()
方式三:通過Task工廠,新建一個線程
// 方式一,通過Start
Task t1 = new Task(() => { Console.WriteLine("我是Task方式一"); });
t1.Start();// 方式二,通過Run
Task t2= Task.Run(()=>{Console.WriteLine("我是Task方式二"); });// 方式三,通過工廠
Task t3= Task.Factory.StartNew(()=>{Console.WriteLine("我是Task方式三"); });


帶返回值與不帶返回值的Task
Task無返回值: 接收的是Action委托類型
Task<TResult>有返回值:接收的是Func<TResult>委托類型

static void Main()
{// 沒有返回參數(shù)Task t1 = new Task(() => { Console.WriteLine("我是Task沒有返回參數(shù)"); });t1.Start();// 有返回參數(shù)Task<int> t2 = new Task<int>(() => { return 1+1; });t2.Start();int result = t2.Result;Console.WriteLine(result);
}


輸出結(jié)果

我是Task沒有返回參數(shù)
2
一次性建立多個任務(wù)場景

static void test1()
{Task[] taskArray = new Task[10];for (int i = 0; i < 10; i++){int bb = i;Task t = Task.Run(() => { Console.WriteLine("任務(wù)ID:{0}, 結(jié)果:{1}",Thread.CurrentThread.ManagedThreadId, bb); });taskArray[i] = t;}// 等待所有任務(wù)完成Task.WaitAll(taskArray);
}


輸出結(jié)果

任務(wù)ID:4, 結(jié)果:0
任務(wù)ID:10, 結(jié)果:4
任務(wù)ID:7, 結(jié)果:1
任務(wù)ID:8, 結(jié)果:2
任務(wù)ID:10, 結(jié)果:7
任務(wù)ID:11, 結(jié)果:5
任務(wù)ID:9, 結(jié)果:3
任務(wù)ID:12, 結(jié)果:6
任務(wù)ID:7, 結(jié)果:8
任務(wù)ID:8, 結(jié)果:9
Task阻塞的三種方式
Wait(): 等待單個線程任務(wù)完成 ?
WaitAll():來指定等待的一個或多個線程結(jié)束
WaitAny():來指定等待任意一個線程任務(wù)結(jié)束

static void test3()
{// 方式一: wait方法Task t = Task.Run(() => { Console.WriteLine("方式1:任務(wù)1......"); }) ;// 等待 上述任務(wù)完成t.Wait();Console.WriteLine("方式一結(jié)束..........");// 方式二: waitAll 方法Task tt = Task.Run(() => { Console.WriteLine("方式2:任務(wù)1......"); });Task tt2 = Task.Run(() => { Console.WriteLine("方式2:任務(wù)2......"); });Task.WaitAll(tt,tt2);Console.WriteLine("方式二結(jié)束..........");// 方式三:waitAny 方法Task ttt = Task.Run(() => { Console.WriteLine("方式3:任務(wù)1......"); });Task ttt2 = Task.Run(() => { Console.WriteLine("方式3:任務(wù)2......"); });Task.WaitAny(ttt, ttt2);Console.WriteLine("方式三結(jié)束..........");}

輸出結(jié)果

方式1:任務(wù)1......
方式一結(jié)束..........
方式2:任務(wù)1......
方式2:任務(wù)2......
方式二結(jié)束..........
方式3:任務(wù)2......
方式3:任務(wù)1......
方式三結(jié)束..........
Task任務(wù)的延續(xù)
WhenAll().ContinueWith() :作用是當WhenAll()中指定的線程任務(wù)完成后再執(zhí)行ContinueWith()中的任務(wù),也就是線程任務(wù)的延續(xù)。而由于這個等待是異步的,因此不會給主線程造成阻塞
WhenAll(task1,task2,...):Task的靜態(tài)方法,作用是異步等待指定任務(wù)完成后,返回結(jié)果。當線程任務(wù)有返回值時,返回Task<TResult[]>對象,否則返回Task對象。
WhenAny():用法與WhenAll()是一樣的,不同的是只要指定的任意一個線程任務(wù)完成則立即返回結(jié)果。
ContinueWith():Task類的實例方法,異步創(chuàng)建當另一任務(wù)完成時可以執(zhí)行的延續(xù)任務(wù)。也就是當調(diào)用對象的線程任務(wù)完成后,執(zhí)行ContinueWith()中的任務(wù)

static void test4()
{Task t = Task.Run(() => { Thread.Sleep(1000); Console.WriteLine("我是線程任務(wù)....."); });// 異步創(chuàng)建延續(xù)任務(wù)Task.WhenAll(t).ContinueWith((data) => { Console.WriteLine("我是延續(xù)任務(wù)...."); });Console.WriteLine("這是主線程........");Console.ReadKey();}


輸出結(jié)果

這是主線程........
我是線程任務(wù).....
我是延續(xù)任務(wù)....
注:Task任務(wù)的延續(xù) 與 上面阻塞相比,主要的好處就是 延續(xù)是異步的不會阻塞主線程

Task的父子任務(wù)
TaskCreationOptions.AttachedToParent:用于將子任務(wù)依附到父任務(wù)中

static void test5()
{// 建立一個父任務(wù)Task parentTask = new Task(() => {// 創(chuàng)建兩個子任務(wù),依附在父任務(wù)上Task.Factory.StartNew(() => { Console.WriteLine("子task1任務(wù)。。。。。。"); }, TaskCreationOptions.AttachedToParent);Task.Factory.StartNew(() => { Console.WriteLine("子task2任務(wù)。。。。。。"); }, TaskCreationOptions.AttachedToParent);Thread.Sleep(1000);Console.WriteLine("我是父任務(wù)........");});parentTask.Start();parentTask.Wait();Console.WriteLine("這里是主線程.......");Console.ReadKey();
}

輸出結(jié)果

子task2任務(wù)。。。。。。
子task1任務(wù)。。。。。。
我是父任務(wù)........
這里是主線程.......
Task中的任務(wù)取消
Task中的取消功能使用的是CanclelationTokenSource,即取消令牌源對象,可用于解決多線程任務(wù)中協(xié)作取消和超時取消
CancellationToken Token:CanclelationTokenSource類的屬性成員,返回CancellationToken對象,可以在開啟或創(chuàng)建線程時作為參數(shù)傳入。
IsCancellationRequested:表示當前任務(wù)是否已經(jīng)請求取消。Token類中也有此屬性成員,兩者互相關(guān)聯(lián)。
Cancel():CanclelationTokenSource類的實例方法,取消線程任務(wù),同時將自身以及關(guān)聯(lián)的Token對象中的IsCancellationRequested屬性置為true。
CancelAfter(int millisecondsDelay):CanclelationTokenSource類的實例方法,用于延遲取消線程任務(wù)。
取消任務(wù)的兩種情況
情況一:通過Cancel()方法
情況二:通過CancelAfter(milliseconds) 方法

static void test6()
{// 情況一: 直接取消// 創(chuàng)建取消令牌源對象CancellationTokenSource cst = new CancellationTokenSource();//第二個參數(shù)傳入取消令牌Task t = Task.Run(() => {while (!cst.IsCancellationRequested){Thread.Sleep(500);Console.WriteLine("情況一,沒有接收到取消信號......");}}, cst.Token);Thread.Sleep(1000);//1秒后結(jié)束cst.Cancel();?Console.ReadKey();// 情況二: 延遲取消CancellationTokenSource cst2 = new CancellationTokenSource();Task t2 = Task.Run(() => {while (!cst2.IsCancellationRequested){Console.WriteLine("情況二,沒有接收到取消信號......");}}, cst2.Token);//1秒后結(jié)束cst2.CancelAfter(1000);Console.ReadKey();}


Task跨線程訪問界面控件
通過 TaskScheduler.FromCurrentSynchronizationContext() ? 獲取TaskScheduler,并將其放入Task的start() 方法中 或 放入延續(xù)方法中即可
放入start() 方法中?
放入 ContinueWith() 延續(xù)方法中
// 通過start方法

private void button1_Click(object sender, EventArgs e)
{Task t = new Task(() =>{// 為界面控件賦值this.textBox1.Text = "線程內(nèi)賦值";});task.Start(TaskScheduler.FromCurrentSynchronizationContext());
}// 通過延續(xù)方法
private void button1_Click(object sender, EventArgs e)
{Task.Run(() =>{Thread.Sleep(1000);}).ContinueWith(t => {this.textBox1.Text = "線程內(nèi)賦值";}, TaskScheduler.FromCurrentSynchronizationContext());
}


Task的異常處理
異常捕獲
Task線程的異常處理不能直接將線程對象相關(guān)代碼try-catch來捕獲,需要通過調(diào)用線程對象的wait()函數(shù)來進行線程的異常捕獲
線程的異常會聚合到AggregateException異常對象中(AggregateException是專門用來收集線程異常的異常類),多個異常 需要通過遍歷該異常對象來獲取異常信息
如果捕獲到線程異常之后,還想繼續(xù)往上拋出,就需要調(diào)用AggregateException對象的Handle函數(shù),并返回false。(Handle函數(shù)遍歷了一下AggregateException對象中的異常)
?

static void test7()
{Task t = Task.Run(() =>{throw new Exception("異常拋出.....");});try{t.Wait();}catch (AggregateException ex){Console.Error.WriteLine(ex.Message);foreach (var item in ex.InnerExceptions){Console.WriteLine("內(nèi)異常:"+item.Message);}//將異常往外拋出// ex.Handle(p => false);}Console.ReadKey();
}


輸出結(jié)果

One or more errors occurred. (異常拋出.....)
內(nèi)異常:異常拋出.....

http://www.risenshineclean.com/news/4646.html

相關(guān)文章:

  • 項目網(wǎng)站建設(shè)方案佛山網(wǎng)站建設(shè)工作
  • 做便民網(wǎng)站都需要提供什么海外推廣
  • 做英文網(wǎng)站用目錄還是子域名找做網(wǎng)站的公司
  • 小企業(yè)想做網(wǎng)站推廣找哪家強網(wǎng)站服務(wù)器ip地址查詢
  • 公司做網(wǎng)站好不好長沙seo服務(wù)哪個公司好
  • 網(wǎng)站一鍵制作哪家公司做seo
  • 網(wǎng)站開發(fā)與維護算什么職位公司培訓
  • 怎么來自己做網(wǎng)站優(yōu)化360手機優(yōu)化大師安卓版
  • 嘉興做網(wǎng)站優(yōu)化識圖搜索在線 照片識別
  • 網(wǎng)站建設(shè)公司新聞免費發(fā)布信息網(wǎng)站大全
  • 網(wǎng)站建設(shè)銀川網(wǎng)站注冊時間查詢
  • 如何做影視劇網(wǎng)站交換鏈接適合哪些網(wǎng)站
  • 長沙網(wǎng)站制作app開發(fā)公司百度搜索推廣和信息流推廣
  • 龍崗網(wǎng)站注冊電子商務(wù)專業(yè)就業(yè)方向
  • 橙子建站官網(wǎng)是哪個seo代碼優(yōu)化工具
  • 電子線路板東莞網(wǎng)站建設(shè)免費的seo優(yōu)化
  • java做企業(yè)網(wǎng)站小小課堂seo自學網(wǎng)
  • 做ppt一般在什么網(wǎng)站要怎么網(wǎng)絡(luò)做推廣
  • 怎么用b2b網(wǎng)站做排名快速優(yōu)化工具
  • 哪種瀏覽器可以打開所有網(wǎng)站不限制內(nèi)容的搜索引擎
  • 網(wǎng)做網(wǎng)站google關(guān)鍵詞查詢工具
  • 幫公司做網(wǎng)站商丘網(wǎng)站seo
  • 公司網(wǎng)站開發(fā)招標書天津優(yōu)化公司哪家好
  • 空間商網(wǎng)站站長之家域名查詢官網(wǎng)
  • 做海外網(wǎng)站推廣直播營銷
  • 自己個人的網(wǎng)站怎么設(shè)計營銷策劃的六個步驟
  • 網(wǎng)站使用幫助內(nèi)容銷售策略和營銷策略
  • 網(wǎng)站公司建設(shè)網(wǎng)絡(luò)營銷方法
  • 可以做產(chǎn)品推廣的網(wǎng)站寧波seo關(guān)鍵詞
  • 網(wǎng)站怎么做預(yù)約小程序電商網(wǎng)站seo