C# 使用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);
      
           
        }

时间: 2024-10-20 12:38:08

C# 使用Task实现任务超时,多任务一起执行的相关文章

C# 给某个方法设定执行超时时间 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死, 但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的.那么我们又是否有一种比较通用的方法.来设定某一个方法的执行超时的时间,让该其一旦超过指定时间则跳出指定方法.进而继续向下执行呢? 答案当然是肯定的. delegate.BeginInvoke可以实现代

C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

/// <summary> /// 控制函数执行时间,超时返回null不继续执行 /// 调用方法 /// FuncTimeout.EventNeedRun action = delegate(object[] param) /// { /// //调用自定义函数 /// return Test(param[0].ToString(), param[1].ToString(), (DateTime)param[2]); /// }; /// FuncTimeout ft = new FuncT

mysql查询超时对PHP执行的影响

最近遇到一个问题,就是在高并发下,mysql性能出现了瓶颈,由于PHP是一种弱类型的语言,没有类型一说.因此,当mysql返回并非预期结果时,会导致后续逻辑错误. 1)线程阻塞测试 当sql语句执行太慢,会导致mysql的连接数被耗尽,无法处理新的请求. 测试方法 执行set global  max_connections=1;语句,并在另一个程序中开启长连接占用该连接,此时,mysql服务已经无连接可用. PHP代码如下: <?php $con=mysql_connect('127.0.0.1

windows C++ 多任务并发执行设计

1.问题描述 如图: (1)服务端负责下发任务:且每次下发一个任务,下发任务个数不固定(通过下发界面勾选下发),但总个数<=4个. (2)客户端负责接收任务,接收任务后要循环执行,除非接收到停止指令后停止执行. 指令类型分为: 1)心跳指令--用于保活连接: 2)任务开始指令--用于开始执行任务: 3)任务中止指令--用于结束任务: 2.设计详解 (1)客户端要并发运行,且会调用相同接口传递不同参数实现,所以必须进行多线程同步. 线程数目由客户端Socket接收信息解析后而定,但总数目会<=4

linux screen 多任务后台执行

1.安装工具:yum install -y screen 2.进入新screen界面:screen 3.回到原命令行:先按CTRL+a,然后再按d 4.查看现有的screen回话:screen -ls 5.跳转到某screen中:screen -r 2684 原文地址:https://www.cnblogs.com/tiandi/p/9974860.html

Shell脚本中的多任务并发执行

正常情况下,Shell脚本中的命令是串行执行的,当一条命令执行完才会执行接下来的命令.比如下面这段代码: #!/bin/bash for i in {1..10};do echo $i done echo "END" 执行结果: 1 2 3 4 5 6 7 8 9 10 END 可以看到,循环体中的"echo $i"命令是串行执行的.但是如果所执行的命令耗时比较长,这就会导致整个程序的执行时间非常长,甚至可能导致程序执行时卡在那里,长时间失去响应.比如我们需要完成这

SpringBoot2.x整合quartz实现多任务定时执行

一.pom文件中导入相关依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> 二.分别编写任务代码类 /** * 任务一 */ public class MyQuartzJob extends QuartzJobBean { @Overri

线程(Thread,ThreadPool)、Task、Parallel

线程(Thread.ThreadPool) 线程的定义我想大家都有所了解,这里我就不再复述了.我这里主要介绍.NET Framework中的线程(Thread.ThreadPool). .NET Framework中的线程分为两类:1.前台线程:2.后台线程. 1.前台线程 class Program { static void Main(string[] args) { Console.WriteLine("=====Thread====="); TestThread(); Cons

C# CancellationTokenSource 终止线程 CancellationTokenSource实现对超时任务的取消

C# 使用 CancellationTokenSource 终止线程 使用CancellationTokenSource对象需要与Task对象进行配合使用,Task会对当前运行的状态进行控制(这个不用我们关心是如何孔控制的).而CancellationTokenSource则是外部对Task的控制,如取消.定时取消. 下面我们来看看示例代码 class Program { //声明CancellationTokenSource对象 static CancellationTokenSource c