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默认对线程的调度是逐步增加的,连续多次运行并发线程,会提高占用的线程数,而等若干 ...
随机推荐
- USACO 5.4 Telecowmunication(最大流+枚举)
面对最小割之类的题目,完全木想法... 枚举+最大流..复杂度很大了...居然很快的就过了.. /* ID: cuizhe LANG: C++ TASK: telecow */ #include &l ...
- php pdo分页
<table width="95%" border="1" cellspacing="0" cellpadding="0&q ...
- 一个Java方法覆盖的小问题
class SuperClass{ public SuperClass() { System.out.println("superclass "); show(); } publi ...
- Scrum会议3(Beta版本)
组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...
- “通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决
问题: windows通过jumpserver远程登录到linux服务器,使用rz上传jar包,速度太慢(10k以内). 解决方案: 思路:通过ssh直接登录远程服务器 1.secureCRT-> ...
- Redis 笔记与总结4 set 和 zset 类型
(一)set 类型 set 是集合是 string 类型的无序集合. set 元素最大可以包含(2 的 32 次方)个元素.set 的是通过 hash table 实现的,所以添加.删除和查找的复杂度 ...
- [教程] 以本论坛为例,手把手教你使用按键精灵POST登陆网页
本帖最后由 isaacc 于 2012-2-26 11:08 编辑 整个操作,很无脑.只要你够勤快,你学不会,你来咬我.懒人和伸手党就直接复制代码去玩吧,但我不是叫你拿去干坏事. 准备工具:WPE和I ...
- AP_总体业务及方案
AP关键业务点说明 关键业务点 说明 预付款余额收回 1. 在应付款管理系统中输入一张虚拟发票,该发票的目的是在系统中冲减对供应商的预付款额,其金额等于预付款的未核销金额,供应商为原供应商. 借:其他 ...
- IOS NSDate NSDateFormatter 导致相差8小时
时间问题应该是所有编程语言都要处理的.详细学过php的同学知道,php中也会有相差8小时的问题,然而php可以非常方便的解决的,直接设置下就好了 我最近在学习IOS的过程中,发现IOS的日期处理也是个 ...
- SQL Server游标【转】
什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作 ...