C#利用Task实现任务超时多任务一起执行的方法

作者:change_4_now 时间:2023-07-04 20:03:38 

前言

其实Task跟线程池ThreadPool的功能类似,不过写起来更为简单,直观。代码更简洁了,使用Task来进行操作。可以跟线程一样可以轻松的对执行的方法进行控制。

创建Task有两种方式,一种是使用构造函数创建,另一种是使用 Task.Factory.StartNew 进行创建。

如下代码所示

1.使用构造函数创建Task


Task t1 = new Task(MyMethod);

2.使用Task.Factory.StartNew 进行创建Task


Task t1 = Task.Factory.StartNew(MyMethod);

其实这两种方式都是一样的,Task.Factory 是对Task进行管理,调度管理这一类的。好学的伙伴们,可以深入研究。这不是本文的范畴,需要的朋友可以进去脚本之家进行学习。

本文将充分使用Task的异步功能,下面来一起看看详细的介绍吧。

代码实现:

1.实现了任务超时 退出任务

2.多个任务一起执行


 /// <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

标签:c#,task,任务超时
0
投稿

猜你喜欢

  • 深入解析java中的locale

    2023-11-09 18:14:20
  • IDEA离线安装maven helper插件的图文教程

    2023-11-28 16:00:24
  • 利用logback 设置不同包下的日志级别

    2022-08-11 20:05:43
  • android之listview悬浮topBar效果

    2022-12-24 23:29:58
  • Unity UI实现拖拽旋转

    2023-04-10 06:44:59
  • Java 深入浅出掌握Collection单列集合Set

    2023-10-07 18:49:32
  • Java验证码功能的实现方法

    2023-07-05 21:28:21
  • C#多线程之线程控制详解

    2022-02-04 17:51:44
  • Maven工程打包jar的多种方式

    2022-12-15 06:54:46
  • .Net WInform开发笔记(五)关于事件Event

    2023-11-22 01:00:18
  • 一文讲通Java为什么不支持多继承原理

    2023-09-28 23:32:50
  • Android自定义View实现炫酷进度条

    2023-09-22 00:16:07
  • C#中怎样从指定字符串中查找并替换字符串?

    2023-09-30 14:26:24
  • Android AlertDialog自定义样式实现代码

    2023-07-08 13:10:06
  • 详解C# 反射(Reflection)

    2021-09-08 14:42:59
  • 基于C#解决库存扣减及订单创建时防止并发死锁的问题

    2023-03-16 20:59:53
  • 浅谈java中OO的概念和设计原则(必看)

    2023-11-24 13:09:56
  • Spring与Struts整合之让Spring管理控制器操作示例

    2022-08-22 12:53:46
  • Java中stream处理中map与flatMap的比较和使用案例

    2023-11-21 02:27:53
  • 使用@Order控制配置类/AOP/方法/字段的加载顺序详解

    2023-09-05 17:34:35
  • asp之家 软件编程 m.aspxhome.com