当前位置: 首页 > 编程语言 > C#

TaskContinuation与async-await并行执行分享

时间:2023-04-10 17:41:51 C#

TaskContinuation与async/await并行执行在使用async/await结构的控制台应用程序的上下文中,我想知道“continuation”是否可以执行在不同的CPU在多个线程上并行运行。我认为是这种情况,因为延迟发布在默认任务调度程序(控制台应用程序中没有SynchronizationContext),这是线程池。我知道async/await构造不会构造任何额外的线程。线程池构建的每个CPU仍然应该至少有一个线程,所以如果线程池上发布了一个延续,它可以在不同的CPU上并行安排任务延续......这就是我的想法,但出于某种原因我昨天是对的我真的很困惑,我不再那么确定了。下面是一些简单的代码:publicclassAsyncTest{inti;publicasyncTaskDoOpAsync(){awaitSomeOperationAsync();//下面的代码延续可以并行运行吗?我++;//一些其他的延续代码....}publicvoidStart(){for(inti=0;i<1000;i++){var_=DoOpAsync();}//dummyvariabletobypasswarning}}SomeOperationAsync本身不会创建任何线程,为了举例说明它只是依赖于I/O完成端口来异步发送一些请求,所以根本没有线程被阻塞。现在,如果我调用将发出1000个异步操作的Start方法,是否可以在不同的CPU线程上并行运行异步方法的延续代码(在await之后)?即在这种情况下我是否需要处理线程同步并同步对字段“i”的访问?是的,你应该把线程同步逻辑放在i++周围,因为多个线程在等待时可能同时执行代码。作为for循环的结果,将创建多个任务。这些任务将在不同的线程池线程上执行。这些任务完成后,会继续继续执行,也就是等待后的代码会在不同的线程池线程上再次执行。这使得多个线程可以并发执行i++你的理解是正确的:在控制台应用程序中,默认情况下,由于默认的SynchronizationContext会继续将deferreds调度到线程池。每个异步方法都将异步启动,因此for循环将在同一线程上执行DoOpAsync的开头。假设SomeOperationAsync返回一个不完整的任务,将在线程池上安排继续。因此,对DoOpAsync的每次调用都可以并行继续。以上就是C#学习教程的全部内容:任务继续与async/await并行执行。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。涉及侵权,请点击维权联系管理员删除。如需转载请注明出处: