这篇文章主要介绍了如何在C#中一些应用task的实例,简单易懂的代码能更好的帮你学习,有兴趣的朋友可以了解下
Task的应用
Task的MSDN的描述如下:
【Task类的表示单个操作不会返回一个值,通常以异步方式执行。
Task对象是一种的中心思想基于任务的异步模式首次引入.NETFramework 4 中。
因为由执行工作Task对象通常以异步方式执行线程池线程上而不是以同步方式在主应用程序线程中,可以使用Status属性,并将IsCanceled, IsCompleted,和IsFaulted属性,以确定任务的状态。
大多数情况下,lambda 表达式用于指定该任务所执行的工作量。
对于返回值的操作,您使用Task类。】
我对于Task的理解是这样的,Task是FrameWork4引进的新功能,他和ConCurrent命名空间一起被引进,用来替代Thread的使用。
根据我的使用,个人觉得,他确实比Thead的功能要丰富一些。
下面我们一起看一个最简单的例子:
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)
{ //当前线程标识 Console.WriteLine(Thread.CurrentThread.GetHashCode());
Task task = new Task(run);
Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status);//状态 task.Start();
Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status);//状态 //任务完成后执行新任务
Action ation = new Action(taskStart);
task.ContinueWith(ation);
Console.Read();
} public static void taskStart(Task task)
{
task = new Task(run);
task.Start(); //如果注释上面两句话,则任务标识为 task.ContinueWith(ation)中task的任务
Console.WriteLine("任务标识:" + task.GetHashCode() + ",状态:" + task.Status + ",当前线程:" + Thread.CurrentThread.GetHashCode());//状态
} public static void run()
{
Console.WriteLine("this is run");
}
}
}
一,task.GetHashCode(),是获取Task实例的唯一标识,每个Task都不一样。
测试发现,Task.GetHashCode()并不等于Thread.CurrentThread.GetHashCode()。
二,task.ContinueWith(),是任务结束后继续执行任务的方法,传一个Action,当任务结束后,触发该Action。
任务刚new出来的时候,task就又状态了,是Created,一但运行了,状态就是WaitingToRun。
运行结果如下:
根据MSDN的说明,Task.State是获取TaskState的枚举值,其枚举值代表的意义如下
|Canceled |该任务已通过对其自身的 CancellationToken 引发 OperationCanceledException 对取消进行了确认,此时该标记处于已发送信号状态;或者在该任务开始执行之前,已向该任务的 CancellationToken 发出了信号。 有关更多信息,请参见任务取消。
| Created |该任务已初始化,但尚未被计划。
| Faulted |由于未处理异常的原因而完成的任务。
| RanToCompletion |已成功完成执行的任务。
| Running |该任务正在运行,但尚未完成。
| WaitingForActivation |该任务正在等待 .NET Framework 基础结构在内部将其激活并进行计划。
| WaitingForChildrenToComplete |该任务已完成执行,正在隐式等待附加的子任务完成。
| WaitingToRun |该任务已被计划执行,但尚未开始执行。
任务嵌套
任务嵌套就是指在一个任务中又创建了一个任务。
而新建的任务就是子任务。在没有特殊声明的情况下,父子任务是一起运行的。
如SimpleNestedTask方法。
父子任务关联需要在创建子任务的时候,增加参数TaskCreationOptions.AttachedToParent。
将父子任务关联起来,此时父任务将等待子任务结束,才会完成。
如果使用Task创建任务,不需要使用TaskCreationOptions.AttachedToParent参数,因为只要父任务使用了子任务的返回结果,父任务自然就会等待子任务完成。
public class Program
{
static void Main(string[] args)
{
WaitForSimpleNestedTask();
Console.WriteLine("=====================================================");
SimpleNestedTask();
Thread.SpinWait(600000);//等待SimpleNestedTask结束 再运行
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的线程安全的
因为,MSDN将在System.Collections.Concurrent命名空间下的集合,都称为线程安全的集合。
线程安全可以理解为可以被多个线程同时使用的集合,而且同时使用的时候是该集合的值是准确的。
下面举一个使用线程安全集合的例子,使用的是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个,也可以不定义大小
static BlockingCollection blocking = new BlockingCollection(51);
static void Main(string[] args)
{
blocking = new BlockingCollection();
Console.WriteLine("当前blocking为:" + blocking.IsCompleted + "设置了集合大小count一样是0,blocking.Count:" + blocking.Count());
//当前线程标识
Console.WriteLine(Thread.CurrentThread.GetHashCode());
for (int i = 0; i < 3; i++)
{
////如果添加到第3个,就设置添加完成,这时在添加就会抛异常
//if (i == 3)
//{
// blocking.CompleteAdding();
/
本文标题为:C# task应用实例详解
基础教程推荐
- winform把Office转成PDF文件 2023-06-14
- unity实现动态排行榜 2023-04-27
- ZooKeeper的安装及部署教程 2023-01-22
- C#控制台实现飞行棋小游戏 2023-04-22
- C# 调用WebService的方法 2023-03-09
- linux – 如何在Debian Jessie中安装dotnet core sdk 2023-09-26
- C#类和结构详解 2023-05-30
- C# windows语音识别与朗读实例 2023-04-27
- 一个读写csv文件的C#类 2022-11-06
- C# List实现行转列的通用方案 2022-11-02