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

并行运行异步方法分享

时间:2023-04-11 01:14:18 C#

并行运行异步方法我有一个异步方法GetExpensiveThing(),它执行一些昂贵的I/O工作。这就是我使用它的方式://串行执行publicasyncTaskGetThings(){varfirst=awaitGetExpensiveThing();varsecond=awaitGetExpensiveThing();返回新列表(){第一,第二};但由于这是一种昂贵的方法,我想并行执行这些调用。我原以为移动await会解决这个问题://SerialexecutionpublicasyncTaskGetThings(){varfirst=GetExpensiveThing();varsecond=GetExpensiveThing();returnnewList(){先等待,再等待};这没有用,所以我将它们包装在一些任务中,这有效://ParallelexecutionpublicasyncTaskGetThings(){varfirst=Task.Run(()=>{returnGetExpensiveThing();});varsecond=Task.Run(()=>{returnGetExpensiveThing();});returnnewList(){first.Result,second.Result};我什至尝试在任务中和周围等待和异步,但这真的很混乱,我没有运气。有没有更好的方法来并行运行异步,或者任务是一种好方法?有没有更好的方法来并行运行异步,或者任务是一种好方法?是的,“最佳”方法是使用Task.WhenAll方法。但是,您的第二种方法应该并行运行。我创建了一个.NETFiddle,它应该有助于解决这个问题。您的第二种方法实际上应该并行运行。我的小提琴证明了这一点!考虑以下内容:publicTaskGetThingsAsync(){varfirst=GetExpensiveThingAsync();varsecond=GetExpensiveThingAsync();返回Task.WhenAll(第一,第二);请注意,使用“Async”后缀比使用GetThings和GetExpensiveThing更好——我们应该分别使用GetThingsAsync和GetExpensiveThingAsync——来源。如果GetExpensiveThing是正确的异步(意味着它不同步执行任何IO或CPU工作),那么调用这两种方法然后等待结果的第二种解决方案应该可行。您还可以使用Task.WhenAll。但如果情况并非如此,您可以通过将每个任务发布到线程池并使用Task.WhenAll组合器来获得更好的结果,例如:publicTask>GetThings()=>Task.WhenAll(Task.Run(()=>GetExpensiveThing()),Task.Run(()=>GetExpensiveThing()));(注意我将返回类型更改为IList以避免完全等待。)您应该避免使用Result属性。它会导致调用者线程阻塞等待任务完成,这与使用延续的await或Task.WhenAll不同。您可以使用Task.WhenAll,它会在所有相关任务完成后返回,请在此处查看此问题以供参考。如果你在列表中做了很多任务,想要等待最后的结果,那么我推荐使用一个有并行度限制的分区。我修改了StephenToub的博客优雅的现代LINQ方法:等待funcBody(partition.Current);}}}returnTask.WhenAll(Partitioner.Create(source).GetPartitions(maxDoP).AsParallel().Select(p=>AwaitPartition(p)));它是如何工作的很简单,使用IEnumerable-将其解析为偶数分区,并同时为每个分区中的每个元素触发函数/方法。在任何时候,每个分区中只有一个元素,但n个分区中有n个任务。扩展用法:awaitmyList.ParallelForEachAsync(myFunc,Environment.ProcessorCount);以上就是C#学习教程:并行运行异步方法的全部内容。如果对大家有用,需要进一步了解C#学习教程,还望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: