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默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
随机推荐
- COJ986 WZJ的数据结构(负十四)
WZJ的数据结构(负十四) 难度级别:D: 运行时间限制:6000ms: 运行空间限制:262144KB: 代码长度限制:2000000B 试题描述 请你设计一个数据结构,完成以下功能: 给定一个大小 ...
- Checkbox的选中删除功能且Ajax返回后清除所选行
转摘:http://javaweb1024.com/qianduan/jQuery/2015/04/13/544.html 功能描述:多选框勾选以后(全部或者部分),需要想后台提交已勾选的数据(Aja ...
- Nhibernate Case SUM
SELECT ID END) as nbRowWithValueOf2, END) as nbRowWithValueOf3 FROM Foo GROUP BY ID queryover = quer ...
- [IT新应用]农民朋友的电子商务
今天通过http://olympiawa.gov/visitors.aspx olympia市的官网,到 http://www.olympiafarmersmarket.com/vendors-1/到 ...
- twitter storm源码走读之3--topology提交过程分析
概要 storm cluster可以想像成为一个工厂,nimbus主要负责从外部接收订单和任务分配.除了从外部接单,nimbus还要将这些外部订单转换成为内部工作分配,这个时候nimbus充当了调度室 ...
- DS实验题 最大最小
题目: 算法设计: 计算最小值算法: 设置一个flag,flag为1的时候代表遇到*号: 遇到数字时: flag为0进栈: flag为1的时候,从栈顶提出一个元素和当前元素运算,结果进栈 最后对栈进行 ...
- Nginx配置文件详细说明[转]
在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络. #运行用户user www-data; #启动进程,通常设置成和cpu的数量相等worker_process ...
- Java单链表的实现
将结点Node进行封装,假设Node的操作有增加,删除,查找,打印几个操作.将Node实现为链表Link的内部类,简化代码. package Chapter5; import java.securit ...
- Ubuntu apparmor何方神圣
AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用是控制应用程序的各种权限,例如对某个目录/文件的读/写,对网络端口的打开/读/写等等. 来之Novell网站的引用: AppAr ...
- 单选按钮控件(Ridio Button)的使用
VC学习笔记5:单选按钮控件(Ridio Button)的使用 一.对单选按钮进行分组: 每组的第一个单选按钮设置属性:Group,Tabstop,Auto;其余按钮设置属性Tabstop,Auto. ...