c# task添加顺序_C# Task详解

本文详细介绍了C#中的Task,包括它的优势、如何创建(无返回值和带返回值的方式)、组合任务(ContinueWith、任务串行、子任务和动态并行)、取消任务以及在多个任务中的应用。示例代码展示了如何使用Task进行异步编程,如Task.Run、Task.Factory.StartNew、async/await等,并展示了如何处理异常和进度通知。
摘要由CSDN通过智能技术生成

1、Task的优势

ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:

◆ ThreadPool不支持线程的取消、完成、失败通知等交互性操作;

◆ ThreadPool不支持线程执行的先后次序;

以往,如果开发者要实现上述功能,需要完成很多额外的工作,现在,FCL中提供了一个功能更强大的概念:Task。Task在线程池的基础上进行了优化,并提供了更多的API。在FCL4.0中,如果我们要编写多线程程序,Task显然已经优于传统的方式。

以下是一个简单的任务示例:

usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApp1

{classProgram

{static void Main(string[] args)

{

Task t= new Task(() =>{

Console.WriteLine("任务开始工作……");//模拟工作过程

Thread.Sleep(5000);

});

t.Start();

t.ContinueWith((task)=>{

Console.WriteLine("任务完成,完成时候的状态为:");

Console.WriteLine("IsCanceled={0}\tIsCompleted={1}\tIsFaulted={2}", task.IsCanceled, task.IsCompleted, task.IsFaulted);

});

Console.ReadKey();

}

}

}

View Code

2、Task的用法

2.1、创建任务

(一)无返回值的方式

方式1:

var t1 = new Task(() => TaskMethod("Task 1"));

t1.Start();

Task.WaitAll(t1);//等待所有任务结束

注:任务的状态:

Start之前为:Created

Start之后为:WaitingToRun

方式2:

Task.Run(() => TaskMethod("Task 2"));

方式3:

Task.Factory.StartNew(() => TaskMethod("Task 3")); 直接异步的方法//或者

var t3=Task.Factory.StartNew(() => TaskMethod("Task 3"));

Task.WaitAll(t3);//等待所有任务结束//任务的状态:

Start之前为:Running

Start之后为:Running

usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApp1

{classProgram

{static void Main(string[] args)

{var t1 = new Task(() => TaskMethod("Task 1"));var t2 = new Task(() => TaskMethod("Task 2"));

t2.Start();

t1.Start();

Task.WaitAll(t1, t2);

Task.Run(()=> TaskMethod("Task 3"));

Task.Factory.StartNew(()=> TaskMethod("Task 4"));//标记为长时间运行任务,则任务不会使用线程池,而在单独的线程中运行。

Task.Factory.StartNew(() => TaskMethod("Task 5"), TaskCreationOptions.LongRunning);#region 常规的使用方式Console.WriteLine("主线程执行业务处理.");//创建任务

Task task = new Task(() =>{

Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");for (int i = 0; i < 10; i++)

{

Console.WriteLine(i);

}

});//启动任务,并安排到当前任务队列线程中执行任务(System.Threading.Tasks.TaskScheduler)

task.Start();

Console.WriteLine("主线程执行其他处理");

task.Wait();#endregionThread.Sleep(TimeSpan.FromSeconds(1));

Console.ReadLine();

}static void TaskMethod(stringname)

{

Console.WriteLine("Task {0} is running on a thread id {1}. Is thread pool thread: {2}",

name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);

}

}

}

View Code

async/await的实现方式:

usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApp1

{classProgram

{async static voidAsyncFunction()

{await Task.Delay(1);

Console.WriteLine("使用System.Threading.Tasks.Task执行异步操作.");for (int i = 0; i < 10; i++)

{

Console.WriteLine(string.Format("AsyncFunction:i={0}", i));

}

}public static voidMain()

{

Console.WriteLine("主线程执行业务处理.");

AsyncFunction();

Console.WriteLine("主线程执行其他处理");for (int i = 0; i < 10; i++)

{

Console.WriteLine(string.Format("Main:i={0}", i));

}

Console.ReadLine();

}

}

}

View Code

(二)带返回值的方式

方式4:

Task task = CreateTask("Task 1");

task.Start();int result = task.Result;

usingSystem;usingSystem.Threading;usingSystem.Threading.Tasks;namespaceConsoleApp1

{classProgram

{static Task CreateTask(stringname)

{return new Task(() =>TaskMethod(name));

}static void Main(string[] args)

{

TaskMethod("Main Thread Task");

Task task = CreateTask("Task 1");

task.Start();int result =task.Result;

Console.WriteLine("Task 1 Result is: {0}", result);

task= CreateTask("Task 2");//该任务会运行在主线程中

task.RunSynchronously();

result=task.Result;

Console.WriteLine("Task 2 Result is: {0}", result);

task= CreateTask("Task 3");

Console.W

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值