5天玩转C#并行和多线程编程

TASK使用总结

Task是什么,字面意思是任务

表示一个异步操作。它是异步操作的首选方式。Task是FRAMEWORK4中的新特性,封装了以前的Thread,并管理Thread。

任务和线程的区别:

  1. 任务是架构在线程之上的,也就是说任务最终还是要抛给线程去执行。
  2. 任务跟线程不是一对一的关系,比如开10个任务并不是说会开10个线程,这一点任务有点类似线程池,但是任务相比线程池有很小的开销和精确的控制。

关于task的一个前台线程特点

不管从工作函数是否有返回值,task都需要在其运行过程中至少有一个前台线程在跑,否则会直接退出,根本原因是所有task管理其他的都是后台线程。有点不好理解,直接记住,task需要一个前台线程运行就行了。

task对于有返回值的工作函数可以通过访问其Result函数来实现阻塞等待。

生命周期

Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。

WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。 //所以在start的时候,是没有开始执行的,在wait之后才开始执行

RanToCompletion:任务执行完毕。

Task.start,TaskFactory.StartNew,Task.RUn

Task.Run Task.Run则是等线程池空闲后在执行

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
Task t1 = new Task(speak);
t1.Start();
t1.Wait();
//使用Task.Factory.StartNew创建任务
Task t2 = Task.Factory.StartNew(speak);
//wait函数意味着
//t2.Wait();
//使用new的方法创建任务
Task t3 = new Task(speak);
t3.Start();
//t3.Wait();
//也可以这样,让两个任务同时执行
Task.WaitAll(t2, t3);
Task.Run(() => Console.WriteLine("您的数值已经被提交了"));
Console.ReadKey();
}
static void speak()
{
for (int i = 0; i < 100000; i++)
{
Console.WriteLine(i + "的时间是" + DateTime.Now + "线程的id是" + Thread.CurrentThread.ManagedThreadId);
}
Thread.Sleep(2000); }
}
}

Task.Wait,Task.Wait,Task.WaitAny不写了

Task.ContinueWith

static void Main(string[] args)
{
var task1 = new Task(() =>
{
Console.WriteLine("Task 1 Begin");
System.Threading.Thread.Sleep(2000);
Console.WriteLine("Task 1 Finish");
});
var task2 = new Task(() =>
{
Console.WriteLine("Task 2 Begin");
System.Threading.Thread.Sleep(3000);
Console.WriteLine("Task 2 Finish");
}); task1.Start();
task2.Start();
var result = task1.ContinueWith<string>(task =>
{
Console.WriteLine("task1 finished!");
return "This is task result!";
}); Console.WriteLine(result.Result.ToString()); Console.Read();
}

Task的取消

var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var task = Task.Factory.StartNew(() =>
{
for (var i = 0; i < 1000; i++)
{
System.Threading.Thread.Sleep(1000);
if (token.IsCancellationRequested)
{
Console.WriteLine("Abort mission success!");
return;
}
}
}, token);
token.Register(() =>
{
Console.WriteLine("Canceled");
});
Console.WriteLine("Press enter to cancel task...");
Console.ReadKey();
tokenSource.Cancel();

最新文章

  1. MVC之Model转Json
  2. php中并发读写文件冲突的解决方案
  3. 阿里社招B2B
  4. ASP.NET 客户端静态文件请求设置缓存(Client Cache)
  5. 【hibernate criteria】hibernate中criteria的完整用法 转
  6. 适应各浏览器图片裁剪无刷新上传jQuery插件(转)
  7. 【转】如何使用KeyChain保存和获取UDID
  8. 以C#编写的Socket服务器的Android手机聊天室Demo
  9. JLink 在J-Flash ARM批处理自动下载
  10. QDomDocument类
  11. 基于visual Studio2013解决C语言竞赛题之0502最小数替换
  12. Oracle 收集统计数据
  13. 浅析mydumper
  14. 使用abcpdf分页设置的问题
  15. jquery为表格行添加上下移动画效果
  16. 【Java并发编程】7、线程池
  17. Thinkphp框架下(同服务器下)不同二级域名之间session互通共享设置
  18. Python3基础 __setattr__ 在属性被赋值的时候,新增提示功能
  19. 对io进行分流
  20. linux将指令加入开机启动或加入环境变量

热门文章

  1. CodeForces 754D Fedor and coupons&amp;&amp;CodeForces 822C Hacker, pack your bags!
  2. bzoj 2252 [ 2010 Beijing wc ] 矩阵距离 —— 多源bfs
  3. 97. ExtJS之EditorGridPanel afteredit属性
  4. Error creating bean with name &quot; &quot;问题
  5. Greenplum使用教程
  6. Docker容器的使用和连接
  7. golang struct里面的字段,或者slice排序
  8. HTML &lt;!DOCTYPE&gt;标签
  9. lua 10进制转换成其它进制table表示
  10. (转)Vue 爬坑之路(二)—— 组件之间的数据传递