Task多线程
Task多线程
1.首先是我们线程之间的启动。
1.这样
Task task = new Task(()=>
{
//
System.Threading.Thread.Sleep();
Console.WriteLine("do something....");
//匿名函数,
//还要其他的一些东邪;
});
task.Start();
2.或则这样
Task t=Task.Run(()=> { Console.WriteLine("直接我就开始run了..."); });
3.再或则这样
static void DoSomething()
{
System.Threading.Thread.Sleep();
Console.WriteLine("do something..static"); }
static void Main(string[] args)
{
Task t1 = new Task(DoSomething);
t1.Start(); //这样我们就启动的落地呀; Console.WriteLine("I am main thread line");
Console.ReadLine();
}
4.这样
Task task = Task.Factory.StartNew(() => { Console.WriteLine("这样,直接使用的Task.Factory.StartNew"); });
TaskFactory tf = new TaskFactory();
Task t1 = tf.StartNew(() => { Console.WriteLine("再或则这样..."); });
总结:大概就是两种方式;构造函数和我们的factory;
1.等待任务的完成并获取返回值,这个就是我们简单的基本操作;
Task<int> task = new Task<int>(() => {
int sum = ;
Console.WriteLine("fucking life...");
for (int i = ; i < ; i++)
{
sum += i;
}
return sum;
});
task.Start();
task.Wait();
var result = task.Result.ToString();
Console.WriteLine("result is "+task.Result.ToString());
Console.WriteLine("I am main thread line");
Console.ReadLine();
2.ContinueWith方法在任务完成时启动一个新任务
Task<int> task = new Task<int>(() => {
System.Threading.Thread.Sleep();
int sum = ;
Console.WriteLine("fucking life...");
for (int i = ; i < ; i++)
{
sum += i;
}
return sum;
});
task.Start();
Console.WriteLine("主线程,执行其他任务...");
Task hoop=task.ContinueWith(t=>{
Console.WriteLine("任务执行完之后的结果是:{0}",t.Result.ToString());
});
Console.WriteLine("I am main thread line");
Console.ReadLine();
Task 的生命周期;
var task1 = new Task(() =>
{
Console.WriteLine("begin");
System.Threading.Thread.Sleep();
Console.WriteLine("finish"); });
Console.WriteLine("before start:"+task1.Status);
task1.Start();
Console.WriteLine("after start:"+task1.Status);
task1.Wait(); //用来主阻塞线程,
Console.WriteLine("after finissh:"+task1.Status);
从我们可以得出Task的简略生命周期:
Created:表示默认初始化任务,但是“工厂创建的”实例直接跳过。
WaitingToRun: 这种状态表示等待任务调度器分配线程给任务执行。
RanToCompletion:任务执行完毕。
Task 流程的控制
var task1 = new Task(() =>
{
Console.WriteLine("task 1 begin");
System.Threading.Thread.Sleep();
Console.WriteLine("task 1 finished");
}); var task2 = new Task(() =>
{
Console.WriteLine("task 2 begin");
System.Threading.Thread.Sleep();
Console.WriteLine("task 2 finished");
}); var task3 = new Task(() =>
{
Console.WriteLine("task 3 begin");
System.Threading.Thread.Sleep();
Console.WriteLine("task 3 finished");
}); task1.Start();
task2.Start();
task3.Start(); Task.WaitAll(task1, task2, task3); //他它接受数组类型的task的使用地呀;
Console.WriteLine("All task has finished"); Console.ReadLine();
Ps: Task.WaitAny
这个用发同Task.WaitAll,就是等待任何一个任务完成就继续向下执行,将上面的代码WaitAll替换为WaitAny,输出结果如下:
ContinueWith的用法。
var task1 = new Task(() =>
{
Console.WriteLine("task 1 begin");
System.Threading.Thread.Sleep();
Console.WriteLine("task 1 finished");
}); task1.Start();
var result = task1.ContinueWith<string>(t=> { Console.WriteLine("task1 finished ");
return "continue task finish.....";
});
//在每次调用ContinueWith方法时,每次会把上次Task的引用传入进来,以便检测上次Task的状态,
var send = Task.Factory.StartNew(() => { Console.WriteLine("fuck life.."); })
.ContinueWith<bool>(s => { if ( == ) return false; })
.ContinueWith<string>(r =>
{
if (r.Result)
{
return "Finished"; //可以获取上一个流程task 中的值
}
else
{
return "Error";
} });
Console.WriteLine(send.Result);
Task的取消
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Console.WriteLine(token.ToString()); var task = Task.Factory.StartNew(() =>
{
for (var i = ; i < ; i++)
{
System.Threading.Thread.Sleep();
Console.WriteLine("proceeed mission...");
if (token.IsCancellationRequested)
{
Console.WriteLine("Abort mssion sucess!");
//这里也采用轮循的方式....
return;
}
} },token); token.Register(() =>
{
Console.WriteLine("Cancle task....");
}); Console.WriteLine("press enter to cancle task...");
Console.ReadKey();
tokenSource.Cancel(); Console.ReadLine();
这里还有一篇较好的文章:http://www.cnblogs.com/jesse2013/p/async-and-await.html
Task多线程的更多相关文章
- C# Task多线程
来自Eleven老师示例 private void btnTask_Click(object sender, EventArgs e) { Console.WriteLine(); Console.W ...
- Threading.Tasks.Task多线程 静态全局变量(字典) --只为了记录
--------------------------------------------------------------后台代码---------------------------------- ...
- Task多线程进行多进程
using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using Sys ...
- Task 实现多线程的模板
1.Task多线程简单模板 using System; using System.Collections.Generic; using System.Threading.Tasks; ...
- C# -- 使用 Task 执行多线程任务
C# -- 使用 Task 执行多线程任务 1. 使用 Task 执行多线程任务 class Program { static void Main(string[] args) { Task task ...
- 多线程Task
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- C#异步和多线程以及Thread、ThreadPool、Task区别和使用方法
本文的目的是为了让大家了解什么是异步?什么是多线程?如何实现多线程?对于当前C#当中三种实现多线程的方法如何实现和使用?什么情景下选用哪一技术更好? 第一部分主要介绍在C#中异步(async/awai ...
- .NET(C#):await返回Task的async方法
众所周知,async方法只可以返回void,Task和Task<T>. 对于返回void的async方法,它并不是awaitable,所以其他方法不能用await方法来调用它,而返回Tas ...
- 使用Task
http://www.cnblogs.com/Charltsing/p/taskpoolthread.html task默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
随机推荐
- Hadoop分布式文件系统:架构和设计要点
原文:http://hadoop.apache.org/core/docs/current/hdfs_design.html 一.前提和设计目标 1.硬件错误是常态,而非异常情况, HDFS可能是有成 ...
- Apache开启不了------The requested operation has failed!
1.这个问题通常是由于端口被占用了,cmd输入netstat -ano查看端口号,根据端口号80的程序的pid在任务管理器下杀掉它. 2.我遇到这个问题不是这个原因.我由于刚配置了虚拟目录.查看虚拟目 ...
- mysql insert插入新形式,再也不需要拼接多重insert啦
注意一下,不能省略表中的任何字段.包括自增id.而且字段的顺序必须和插入表一致 原理是“表插表” INSERT INTO prod_attr select A.* from ( SELECT AS p ...
- OpenCV学习笔记——视频的边缘检测
使用Canny算子进行边缘检测,并分开输出到三个窗口中,再给每一个窗口添加文字 代码: #include"cv.h" #include"highgui.h" / ...
- velocity学习记录
一.引入文件 静态引入:#include("./footer.vm.html") 动态引入:#parse("./header.vm.html") 说明:./为v ...
- ORA-01791: 不是 SELECTed 表达式
Oracle 9i数据库,执行下面语句出现错误“ORA-01791: 不是 SELECTed 表达式”:select distinct t.name from auth_employee t orde ...
- [服务器]脚本:批处理带参数ping命令 发送邮件脚本
1.批处理带参数ping命令 @echo offecho Input you IP address ......set /p IP=echo Your IP number is %IP%.ping % ...
- Bootstrap插件1--tooltip
在引入bootstrap.js之前我们需要引入jquery的js文件 既然是bootstrap的插件,那么自然需要引用bootstrap.js和bootstrap.css这2个核心文件了 这里了主要介 ...
- PHP学习(五)----jQuery和JSON数据
对于jQuery: jQuery 是一个 JavaScript 库. jQuery 极大地简化了 JavaScript 编程.
- jQuery之换肤与cookie插件
有时候一个网页可以有多个皮肤进行选择,也就是不同的背景,或是一整套新的css,能使整个页面变成另一种风格. 这个功能可以用jQuery来实现.外加cookie插件.有了cookie,就可以长时间的保存 ...