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); }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。
上一篇:Asp.Net中MVC缓存详解
栏 目:C#教程
下一篇:WPF制作带小箭头的按钮完整代码
本文地址:https://www.xiuzhanwang.com/a1/C_jiaocheng/5343.html
您可能感兴趣的文章
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新闻效果的方法
- 01-10C#实现清空回收站的方法
- 01-10C#实现读取注册表监控当前操作系统已安装软件变化的方法
- 01-10C#实现多线程下载文件的方法
- 01-10C#实现Winform中打开网页页面的方法
- 01-10C#实现远程关闭计算机或重启计算机的方法
- 01-10C#自定义签名章实现方法
- 01-10C#文件断点续传实现方法
- 01-10winform实现创建最前端窗体的方法
阅读排行
本栏相关
- 01-10C#通过反射获取当前工程中所有窗体并
- 01-10关于ASP网页无法打开的解决方案
- 01-10WinForm限制窗体不能移到屏幕外的方法
- 01-10WinForm绘制圆角的方法
- 01-10C#实现txt定位指定行完整实例
- 01-10WinForm实现仿视频播放器左下角滚动新
- 01-10C#停止线程的方法
- 01-10C#实现清空回收站的方法
- 01-10C#通过重写Panel改变边框颜色与宽度的
- 01-10C#实现读取注册表监控当前操作系统已
随机阅读
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11ajax实现页面的局部加载
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10delphi制作wav文件的方法
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 04-02jquery与jsp,用jquery
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置
- 08-05织梦dedecms什么时候用栏目交叉功能?