前言
其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观。代码更简洁了,使用Task来进行操作。可以跟线程一样可以轻松的对执行的方法进行控制。
创建Task有两种方式,一种是使用构造函数创建,另一种是使用 Task.Factory.StartNew 进行创建。
如下代码所示
1.使用构造函数创建Task
1
|
Task t1 = new Task(MyMethod);
|
2.使用Task.Factory.StartNew 进行创建Task
1
|
Task t1 = Task.Factory.StartNew(MyMethod);
|
其实这两种方式都是一样的,Task.Factory 是对Task进行管理,调度管理这一类的。好学的伙伴们,可以深入研究。这不是本文的范畴,需要的朋友可以进去服务器之家进行学习。
本文将充分使用Task的异步功能,下面来一起看看详细的介绍吧。
代码实现:
1.实现了任务超时 退出任务
2.多个任务一起执行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
/// <summary>
///做事 需要 ms秒 才能完成
/// </summary>
/// <param name="time"></param>
/// <returns></returns>
static async Task< string > Doing( int time, string name = "我" )
{
Console.WriteLine(name+ "来了" );
await Task.Delay(TimeSpan.FromMilliseconds(time));
return string .Format( "这活{1}干了:{0}ms " , time,name);
}
/// <summary>
/// 设定超时任务 如果超时返回
/// </summary>
/// <param name="needTimeOut"></param>
/// <returns></returns>
static async Task< string > TimeOut( bool needTimeOut)
{
Console.WriteLine(needTimeOut);
var t= new Stopwatch();
t.Start();
var timeOutTask = Task.Delay(150); //1.设定一个超时的任务
var doing = Doing(needTimeOut ? 100 : 300); //2. 真正需要执行的任务
var task = await Task.WhenAny(doing,timeOutTask); //返回任何一个完成的任务
if (task == timeOutTask) //如果超时任务先完成了 就返回 很可惜 他没有完成!
{
return "很可惜 他没有完成!" ;
}
t.Stop();
Console.WriteLine( "耗时:" +t.Elapsed.TotalMilliseconds);
return await doing;
}
/// <summary>
/// 多任务一起执行
/// </summary>
/// <returns></returns>
static async Task Tasks()
{
var t = new Stopwatch();
t.Start();
var list= new List< string >();
var t1 = Doing(1000, "1000" ); //1.定义任务
var t2 = Doing(1500, "1500" );
var t3 = Doing(1200, "1200" );
var tasks = new [] {t1, t2, t3}; //2.任务组
var process = tasks.Select(async tt => //3.等待任务结束 并保存值
{
var result = await tt;
list.Add(result);
});
await Task.WhenAll(process); //4.等待处理完全
foreach (var i in list) //5.查看结果
{
Console.WriteLine(i);
}
t.Stop();
Console.WriteLine( "耗时:" + t.Elapsed.TotalMilliseconds);
}
|
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.cnblogs.com/change4now/p/8012350.html