C#使用Task实现执行并行任务的原理的示例详解.docx

C#使用Task实现执行并行任务的原理的示例详解.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 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)

159****6192 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档