C# 使用Task实现任务超时,多任务一起执行

时间:2021-11-21 20:33:55

简介:充分使用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);
      
           
        }