- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
第
C#使用Task实现执行并行任务的原理的示例详解
目录一、Task执行并行任务的原理二、5个示例展示示例1示例2示例3示例4示例5三、使用async/await关键字注意示例1示例2四、总结
一、Task执行并行任务的原理
使用Task执行并行任务的原理是将任务分成多个小块,每个小块都可以在不同的线程上运行。然后,使用Task.Run方法将这些小块作为不同的任务提交给线程池。线程池会自动管理线程的创建和销毁,并根据系统资源的可用情况来自动调整线程数量,从而实现最大化利用CPU资源的效果。
二、5个示例展示
示例1
下面是一个简单的示例,展示如何使用Task来执行并行任务:
void?Task1()
????//?创建任务数组
????var?tasks?=?new?Task[10];
????for?(var?i?=?0;?i??tasks.Length;?i++)
????{
????????var?taskId?=?i?+?1;
????????//?使用Task.Run方法提交任务
????????tasks[i]?=?Task.Run(()?=
????????{
????????????Console.WriteLine(任务?{0}?运行在线程?{1}?中,?taskId,?Task.CurrentId);
????????????//?执行任务逻辑
????????});
????}
????//?等待所有任务完成
????Task.WaitAll(tasks);
????Console.WriteLine(所有任务运行完成。);
????Console.ReadKey();
在这个示例中,我们创建了一个长度为10的任务数组,然后使用Task.Run方法将每个任务提交给线程池。在任务执行时,使用Task.CurrentId属性获取当前任务的ID,并打印出来以方便观察。最后,我们使用Task.WaitAll方法等待所有任务完成并打印出一条完成信息。
运行的结果:
任务3运行在线程11中
任务4运行在线程12中
任务8运行在线程16中
任务1运行在线程9中
任务2运行在线程10中
任务5运行在线程13中
任务6运行在线程14中
任务7运行在线程15中
任务9运行在线程17中
任务10运行在线程18中
所有任务运行完成。
值得注意的是,在实际开发中,需要根据具体情况来评估任务的大小和数量,以确保并行任务的效率和可靠性。
示例2
另一个使用Task的示例是计算斐波那契数列。我们可以将斐波那契数列的每一项看成一个任务,然后使用Task.WaitAll方法等待所有任务完成。
void?Task2()
????static?long?Fib(int?n)
????{
????????if?(n?is?0?or?1)
????????{
????????????return?n;
????????}
????????else
????????{
????????????return?Fib(n?-?1)?+?Fib(n?-?2);
????????}
????}
????const?int?n?=?10;?//?计算斐波那契数列的前n项
????var?tasks?=?new?Tasklong
????for?(var?i?=?0;?i??i++)
????{
????????var?index?=?i;?//?需要在闭包内使用循环变量时需要赋值给另外一个变量
????????if?(i??2)
????????{
????????????tasks[i]?=?Task.FromResult((long)i);
????????}
????????else
????????{
????????????tasks[i]?=?Task.Run(()?=?Fib(index));
????????}
????}
????//?等待所有任务完成
????Task.WaitAll(tasks);
????//?打印结果
????for?(var?i?=?0;?i??i++)
????{
????????Console.Write({0}?,?tasks[i].Result);
????}
????Console.ReadKey();
在这个示例中,我们使用Task数组来存储所有的任务。如果需要计算的是前两项,则直接使用Task.FromResult创建完成任务,否则使用Task.Run方法创建异步任务并调用Fib方法计算结果。在等待所有任务完成后,我们
文档评论(0)