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默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
随机推荐
- [BZOJ 2631]tree
裸LCT..QAQ写了三遍没写对 真是老了..QAQ 主要错的地方是 init: size[i] = sum[i] = val[i] = mul[i] = 1; pushdown: 注意判断左右儿子是 ...
- Java学习第一步: Win7配置JDK环境
转摘"专注JavaWeb开发":http://www.javaweb1024.com/java/Javajichu/2015/03/02/353.html 下载JDK并安装到本机 ...
- PHP 如何读取一个1G的文件大小
需求如下: 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容. 1. 直接采用file函数来操作 or file_get_content() 肯定报内存溢出注: 由于 fi ...
- iOS移动开发周报-第24期
iOS移动开发周报-第24期 [摘要]:本期iOS移动开发周报带来如下内容:苹果更新了iTunes Connect的设计.UIKit Dynamics 教程:抛掷 Views.iOS APP 架构漫谈 ...
- 【C语言】11-指针
直接引用 1. 回想一下,之前我们是如何更改某个变量的值? 我们之前是通过变量名来直接引用变量,然后进行赋值: char a; a = 10; 2. 看上去是很简单,其实程序内部是怎么操作的呢? ...
- LINUX 2.6.18-238 local root exp
/* * * * 1-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=0 * 0 _ __ __ __ 1 * ...
- APT 常用功能
apt-get install package 安装包 apt-get reinstall package 重新安装包 apt-get upgrade 更新已安装的包 #apt-get update ...
- Hadoop配置文件解析
Hadoop源码解析 2 --- Hadoop配置文件解析 1 Hadoop Configuration简介 Hadoop没有使用java.util.Properties管理配置文件, 也没有使 ...
- linux下挂在u盘,移动硬盘的方法,转移服务器资料的时候,使用移动硬盘什么最方便了
本文章是在centos环境下操作的 最近linux服务器我不小心吧root下面的用户配置,不能远程登录,而且我对linux系统配置也不熟悉,最后的办法就是去了一趟机房,还好是在深圳南山科技园,不算太远 ...
- HDU 2087 kmp模板题
s为主串 t为模板串 求t的nextt 加const #include<stdio.h> #include<string.h> #include<algorithm> ...