C#利用Task实现任务超时多任务一起执行的方法
作者:change_4_now 发布时间:2023-07-04 20:03:38
标签:c#,task,任务超时
前言
其实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


猜你喜欢
- 占位符Placeholder的使用xml中的配置:<?xml version="1.0" encoding=&qu
- Android 4.0 系统定义了一系列的高效导航方式 (Effective Navigation), 主要包括标签、下拉列表、以及向上和返
- 最近比较无聊,随便翻着博客,无意中看到了有的人用VBS读文本内容,也就是读几句中文,emmm,挺有趣的,实现也很简单,都不需要安装什么环境,
- 在JVM中,每个对象都关联一个监视器,这里的对象包含Object实例和Class实例。监视器是一个同步工具,相当于一个许可证,拿到许可证的线
- 1、创建Windows服务 说明:a)Description 服务描述,直接显示到Windows服务列表中的描述;b)Displa
- 本文实例为大家分享了WinForm实现鼠标拖动控件跟随效果的具体代码,供大家参考,具体内容如下1. 运行初始窗口如下:2. 拖动后效果如下:
- 背景在使用Spring Boot Mvc的项目中,使用Long类型作为id的类型,但是当前端使用Number类型接收Long类型数据时,由于
- 本文实例为大家分享了Unity shader实现自由放大缩小效果的具体代码,供大家参考,具体内容如下代码:以下实现的shader代码:Sha
- 成员类型访问权限低于字段本身现在假设你有一个小兵类,他的访问权限是仅限当前程序集。internal class 小兵{public int
- /// <summary> /// 导出Ex
- JAVA的 * 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤
- SpringBoot Admin 实现Actuator端点可视化监控简介Actuator可视化监控SpringBoot AdminNote:
- 进度条以一种客观化的方式,让我们知道程序正在执行的情况,在程序需要时间执行任务的时候,提示进度条友好的告诉用户说,当前任务还没有完成,请稍稍
- 前言我们在上一篇文章教大家使用ImageView+TextView的组合自定义控件...可能在开发中你还需要其他功能,例如:按下效果,可以在
- 前言空间分配要点有:一是空间分配的连续性;二是动态内存申请;三是防止程序执行中出现异常错误。提示:开始讲解了嗷~后续会根据精力持续更新嗷!!
- Java计算一段程序的运行时间介绍了两种方法,一种是毫秒级别的计算,另一种是更精确的纳秒级别的计算。毫秒级别计算时间  
- Spring boot 2.1.X整合Elasticsearch最新版的一处问题新版本的Spring boot 2的spring-boot-
- 数组与链表的比较:数组通过下标访问的话是O(1)数组一旦声明 长度就是固定的数组的数据是物理逻辑均连续的链表增删要快一些, 数组遍历快一些长
- package com.cjonline.foundation.authority.pojo;import java.util
- 本文实例讲述了C#类中static变量用法。分享给大家供大家参考。具体分析如下:先来看一段代码:using System; namespac