最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# task應(yīng)用實(shí)例詳解

 更新時(shí)間:2020年05月29日 11:53:21   作者:Kiba518  
這篇文章主要介紹了如何在C#中一些應(yīng)用task的實(shí)例,簡(jiǎn)單易懂的代碼能更好的幫你學(xué)習(xí),有興趣的朋友可以了解下

Task的應(yīng)用

​Task的MSDN的描述如下:

【Task類(lèi)的表示單個(gè)操作不會(huì)返回一個(gè)值,通常以異步方式執(zhí)行。

Task對(duì)象是一種的中心思想基于任務(wù)的異步模式首次引入.NETFramework 4 中。

因?yàn)橛蓤?zhí)行工作Task對(duì)象通常以異步方式執(zhí)行線程池線程上而不是以同步方式在主應(yīng)用程序線程中,可以使用Status屬性,并將IsCanceled, IsCompleted,和IsFaulted屬性,以確定任務(wù)的狀態(tài)。

大多數(shù)情況下,lambda 表達(dá)式用于指定該任務(wù)所執(zhí)行的工作量。

對(duì)于返回值的操作,您使用Task類(lèi)。】

我對(duì)于Task的理解是這樣的,Task是FrameWork4引進(jìn)的新功能,他和ConCurrent命名空間一起被引進(jìn),用來(lái)替代Thread的使用。

根據(jù)我的使用,個(gè)人覺(jué)得,他確實(shí)比Thead的功能要豐富一些。

下面我們一起看一個(gè)最簡(jiǎn)單的例子:

using System;
using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading;using System.Threading.Tasks;namespace TaskConsole
{  class Program
  {    static void Main(string[] args)
    {      //當(dāng)前線程標(biāo)識(shí)      Console.WriteLine(Thread.CurrentThread.GetHashCode());
      Task task = new Task(run);
      Console.WriteLine("任務(wù)標(biāo)識(shí):" + task.GetHashCode() + ",狀態(tài):" + task.Status);//狀態(tài)       task.Start();
      Console.WriteLine("任務(wù)標(biāo)識(shí):" + task.GetHashCode() + ",狀態(tài):" + task.Status);//狀態(tài)      //任務(wù)完成后執(zhí)行新任務(wù)
      Action ation = new Action(taskStart);
      task.ContinueWith(ation);

      Console.Read();
    }    public static void taskStart(Task task)
    {
      task = new Task(run);
      task.Start();      //如果注釋上面兩句話,則任務(wù)標(biāo)識(shí)為 task.ContinueWith(ation)中task的任務(wù)
      Console.WriteLine("任務(wù)標(biāo)識(shí):" + task.GetHashCode() + ",狀態(tài):" + task.Status + ",當(dāng)前線程:" + Thread.CurrentThread.GetHashCode());//狀態(tài)       
    }    public static void run()
    { 
      Console.WriteLine("this is run");
    }
  }
}

一,task.GetHashCode(),是獲取Task實(shí)例的唯一標(biāo)識(shí),每個(gè)Task都不一樣。

測(cè)試發(fā)現(xiàn),Task.GetHashCode()并不等于Thread.CurrentThread.GetHashCode()。

二,task.ContinueWith(),是任務(wù)結(jié)束后繼續(xù)執(zhí)行任務(wù)的方法,傳一個(gè)Action,當(dāng)任務(wù)結(jié)束后,觸發(fā)該Action。

任務(wù)剛new出來(lái)的時(shí)候,task就又狀態(tài)了,是Created,一但運(yùn)行了,狀態(tài)就是WaitingToRun。

運(yùn)行結(jié)果如下:

根據(jù)MSDN的說(shuō)明,Task.State是獲取TaskState的枚舉值,其枚舉值代表的意義如下

|Canceled |該任務(wù)已通過(guò)對(duì)其自身的 CancellationToken 引發(fā) OperationCanceledException 對(duì)取消進(jìn)行了確認(rèn),此時(shí)該標(biāo)記處于已發(fā)送信號(hào)狀態(tài);或者在該任務(wù)開(kāi)始執(zhí)行之前,已向該任務(wù)的 CancellationToken 發(fā)出了信號(hào)。 有關(guān)更多信息,請(qǐng)參見(jiàn)任務(wù)取消。

| Created |該任務(wù)已初始化,但尚未被計(jì)劃。

| Faulted |由于未處理異常的原因而完成的任務(wù)。

| RanToCompletion |已成功完成執(zhí)行的任務(wù)。

| Running |該任務(wù)正在運(yùn)行,但尚未完成。

| WaitingForActivation |該任務(wù)正在等待 .NET Framework 基礎(chǔ)結(jié)構(gòu)在內(nèi)部將其激活并進(jìn)行計(jì)劃。

| WaitingForChildrenToComplete |該任務(wù)已完成執(zhí)行,正在隱式等待附加的子任務(wù)完成。

| WaitingToRun |該任務(wù)已被計(jì)劃執(zhí)行,但尚未開(kāi)始執(zhí)行。

任務(wù)嵌套

任務(wù)嵌套就是指在一個(gè)任務(wù)中又創(chuàng)建了一個(gè)任務(wù)。

而新建的任務(wù)就是子任務(wù)。在沒(méi)有特殊聲明的情況下,父子任務(wù)是一起運(yùn)行的。

如SimpleNestedTask方法。

父子任務(wù)關(guān)聯(lián)需要在創(chuàng)建子任務(wù)的時(shí)候,增加參數(shù)TaskCreationOptions.AttachedToParent。

將父子任務(wù)關(guān)聯(lián)起來(lái),此時(shí)父任務(wù)將等待子任務(wù)結(jié)束,才會(huì)完成。

如果使用Task創(chuàng)建任務(wù),不需要使用TaskCreationOptions.AttachedToParent參數(shù),因?yàn)橹灰溉蝿?wù)使用了子任務(wù)的返回結(jié)果,父任務(wù)自然就會(huì)等待子任務(wù)完成。

public class Program
 {
 static void Main(string[] args)
 { 
 WaitForSimpleNestedTask();
 Console.WriteLine("=====================================================");
 SimpleNestedTask();
 Thread.SpinWait(600000);//等待SimpleNestedTask結(jié)束 再運(yùn)行
 Console.WriteLine("=====================================================");
 //SimpleNestedTaskAttachedToParent();
 Console.Read();
 }
 static void WaitForSimpleNestedTask()
 {
 var outer = Task.Factory.StartNew(() =>
 {
 Console.WriteLine("Outer1 task executing.");

 var nested = Task.Factory.StartNew(() =>
 {
 Console.WriteLine("Nested1 task starting.");
 Thread.SpinWait(5000000);
 Console.WriteLine("Nested1 task completing.");
 return 42;
 });
 return nested.Result;
 return 1;
 });
 Console.WriteLine("Outer1 has returned {0}.", outer.Result);
 }
 static void SimpleNestedTask()
 {
 var parent = Task.Factory.StartNew(() =>
 {
 Console.WriteLine("Outer2 task executing.");

 var child = Task.Factory.StartNew(() =>
 {
 Console.WriteLine("Nested2 task starting.");
 Thread.SpinWait(500000);
 Console.WriteLine("Nested2 task completing.");
 });
 });
 parent.Wait();
 Console.WriteLine("Outer2 has completed."); 
 }

 static void SimpleNestedTaskAttachedToParent()
 {
 var parent = Task.Factory.StartNew(() =>
 {
 Console.WriteLine("Outer3 task executing.");

 var child = Task.Factory.StartNew(() =>
 {
 Console.WriteLine("Nested3 task starting.");
 Thread.SpinWait(500000);
 Console.WriteLine("Nested3 task completing.");
 }, TaskCreationOptions.AttachedToParent);
 });
 parent.Wait();
 Console.WriteLine("Outer has completed.");
 }

ConCurrent的線程安全的

因?yàn)?,MSDN將在System.Collections.Concurrent命名空間下的集合,都稱為線程安全的集合。

線程安全可以理解為可以被多個(gè)線程同時(shí)使用的集合,而且同時(shí)使用的時(shí)候是該集合的值是準(zhǔn)確的。

下面舉一個(gè)使用線程安全集合的例子,使用的是BlockingCollection。

using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ParallelConsole
{
 class Program
 {
 
 //定義集合大小為51個(gè),也可以不定義大小
 static BlockingCollection blocking = new BlockingCollection(51);
 
 static void Main(string[] args)
 {
  

  blocking = new BlockingCollection();
  Console.WriteLine("當(dāng)前blocking為:" + blocking.IsCompleted + "設(shè)置了集合大小count一樣是0,blocking.Count:" + blocking.Count());
  //當(dāng)前線程標(biāo)識(shí)
  Console.WriteLine(Thread.CurrentThread.GetHashCode());

  for (int i = 0; i < 3; i++)
  {
  ////如果添加到第3個(gè),就設(shè)置添加完成,這時(shí)在添加就會(huì)拋異常
  //if (i == 3)
  //{
  // blocking.CompleteAdding();
  //}
  
  Action action = new Action(run);
  Task task = new Task(action,i); 
  task.RunSynchronously(); 
  }
  Console.WriteLine("設(shè)置添加完成前:" + blocking.IsAddingCompleted);
  //設(shè)置添加完成后
  blocking.CompleteAdding();
  Console.WriteLine("設(shè)置添加完成后:" + blocking.IsAddingCompleted);
  #region 同步取 取3個(gè)
  //for (int i = 0; i < 3; i++)
  //{
  // Action actionTake = new Action(take);
  // actionTake();
  //}
  #endregion
  //并發(fā)讀取
  
  #region 并發(fā)步取 取3個(gè)
  //blocking.IsCompleted 只有當(dāng)集合被添加進(jìn)內(nèi)容,然后又都被取光了以后,他才會(huì)等于ture,否則都是false
  //當(dāng)IsCompleted為ture時(shí),就不能再取了否則會(huì)拋異常
  
  //同時(shí)取,結(jié)果是 
  //blocking:0
  //blocking:2
  //blocking:1
  if (!blocking.IsCompleted)//如果集合沒(méi)取光
  {
  Action actionTake2 = new Action(take);
  Parallel.Invoke(actionTake2, actionTake2, actionTake2);
  }
  #endregion

  Console.WriteLine("當(dāng)前blocking為:" + blocking.IsCompleted + ",blocking數(shù)量為:" + blocking.Count());
  //數(shù)據(jù)被取光了以后, blocking.Count()為0
  Console.Read();
 }

 public static void take()
 {
  //同步取,blocking.Count()會(huì)真實(shí)的表現(xiàn),而異步取,Count是不準(zhǔn)確的,因?yàn)槲胰ount的時(shí)候,可能集合已經(jīng)又被取出數(shù)據(jù)了,測(cè)試10次肯定會(huì)出現(xiàn)不真實(shí)的情況
  Console.WriteLine("blocking:" + blocking.Take() + ",blocking數(shù)量為:" + blocking.Count());
 }
 public static void run(object i)
 {
  int currentI = int.Parse(i.ToString());
  blocking.TryAdd(currentI); 
 }
 }
}

Parallel

Parallel.Invoke(),并發(fā)調(diào)用Action,可以傳多個(gè)Action,也可以傳一個(gè)Action數(shù)據(jù)組。

Task

Task(Action,object),這是Task的構(gòu)造方法,接收Action,object是Action的參數(shù),。

task.RunSynchronously(),他是同步運(yùn)行任務(wù)計(jì)劃用的,同時(shí)他和task.Start()一樣,也可以啟動(dòng)線程。

BlockingCollection集合

屬性一:IsCompleted,他是表示集合是否有數(shù)據(jù),只有當(dāng)集合被添加進(jìn)內(nèi)容,然后又都被取光了以后,他才會(huì)等于ture,否則都是false。

屬性一:BlockingCollection.IsAddingCompleted,表示是否添加完成。針對(duì)blocking.CompleteAdding()的使用,當(dāng)調(diào)用了該方法IsAddingCompleted就為true。

方法一:BlockingCollection.blocking.CompleteAdding(),設(shè)置IsAddingCompleted用的。

方法二:BlockingCollection.Add,添加一個(gè)實(shí)體

方法三:BlockingCollection.TryAdd,添加一個(gè)實(shí)體,我這里用的是這個(gè)方法,區(qū)別是,如果添加重復(fù)項(xiàng),他會(huì)引發(fā)InvalidOperationException這個(gè)異常。

方法四:BlockingCollection.Take,從集合中取一個(gè)值,注意,是真的取出來(lái),取出來(lái)后,BlockingCollection.cout會(huì)減一。

運(yùn)行結(jié)果如下:

到此這篇關(guān)于C# task應(yīng)用實(shí)例的文章就介紹到這了,更多相關(guān)c#task應(yīng)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論

石阡县| 陈巴尔虎旗| 宜州市| 隆回县| 兴和县| 修武县| 济阳县| 凭祥市| 吉隆县| 海丰县| 郁南县| 乐清市| 太保市| 广西| 饶平县| 昭通市| 冕宁县| 卓尼县| 海丰县| 平陆县| 芦山县| 林州市| 钦州市| 离岛区| 萨迦县| 上犹县| 松溪县| 民县| 陕西省| 阿荣旗| 平阴县| 平果县| 灵璧县| 泸定县| 文水县| 读书| 池州市| 饶阳县| 景东| 纳雍县| 丁青县|