如何将 AsParallel 与 async 和 wait 关键字一起使用?

2024-03-20

我正在查看某人的异步示例代码,并注意到其实现方式存在一些问题。在查看代码时,我想知道使用并行方式循环列表是否比正常循环列表更有效。

据我所知,性能上的差异非常小,两者都耗尽了每个处理器,并且完成时间都相同。

这是第一种方法

var tasks= Client.GetClients().Select(async p => await p.Initialize());

这是第二个

var tasks = Client.GetClients().AsParallel().Select(async p => await p.Initialize());

我假设两者之间没有区别是否正确?

完整的程序可以在下面找到

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            RunCode1();
            Console.WriteLine("Here");
            Console.ReadLine();

            RunCode2();
            Console.WriteLine("Here");

            Console.ReadLine();

        }

        private async static void RunCode1()
        {
            Stopwatch myStopWatch = new Stopwatch();
            myStopWatch.Start();

            var tasks= Client.GetClients().Select(async p => await p.Initialize());

            Task.WaitAll(tasks.ToArray());
            Console.WriteLine("Time ellapsed(ms): " + myStopWatch.ElapsedMilliseconds);
            myStopWatch.Stop();
        }
        private async static void RunCode2()
        {
            Stopwatch myStopWatch = new Stopwatch();
            myStopWatch.Start();
            var tasks = Client.GetClients().AsParallel().Select(async p => await p.Initialize());
            Task.WaitAll(tasks.ToArray());
            Console.WriteLine("Time ellapsed(ms): " + myStopWatch.ElapsedMilliseconds);
            myStopWatch.Stop();
        }
    }
    class Client
    {
        public static IEnumerable<Client> GetClients()
        {
            for (int i = 0; i < 100; i++)
            {
                yield return new Client() { Id = Guid.NewGuid() };
            }
        }

        public Guid Id { get; set; }

        //This method has to be called before you use a client
        //For the sample, I don't put it on the constructor
        public async Task Initialize()
        {
            await Task.Factory.StartNew(() =>
                                      {
                                          Stopwatch timer = new Stopwatch();
                                          timer.Start();
                                          while(timer.ElapsedMilliseconds<1000)
                                          {}
                                          timer.Stop();

                                      });
            Console.WriteLine("Completed: " + Id);
        }
    }
}

应该没有什么可辨别的差异。

在你的第一种情况下:

var tasks = Client.GetClients().Select(async p => await p.Initialize());

执行线程将(一次一个)开始执行Initialize对于客户端列表中的每个元素。Initialize立即将一个方法放入线程池中并返回一个未完成的方法Task.

在你的第二种情况下:

var tasks = Client.GetClients().AsParallel().Select(async p => await p.Initialize());

执行线程将分叉到线程池并(并行)开始执行Initialize对于客户端列表中的每个元素。Initialize具有相同的行为:它立即将方法排队到线程池中并返回。

这两个时间几乎相同,因为您只并行化少量代码:将方法排队到线程池以及返回未完成的代码Task.

If Initialize在第一次之前做了一些较长的(同步)工作await,使用可能有意义AsParallel.

记住,所有async方法(和 lambda)开始同步执行(请参阅官方常见问题解答 http://blogs.msdn.com/b/pfxteam/archive/2012/04/12/10293335.aspx or 我自己的介绍帖子 http://nitoprograms.blogspot.com/2012/02/async-and-await.html).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将 AsParallel 与 async 和 wait 关键字一起使用? 的相关文章

随机推荐

  • 在 Spring boot 中设置 hibernate fetch size

    如何在Spring boot应用程序中设置hibernate jdbc fetch size属性 可以将其设置到application properties中吗 您应该使用前缀spring jpa properties 查看官方文档here
  • C++ lambda 将捕获作为函数指针

    我正在研究 C lambda 及其到函数指针的隐式转换 我的起始示例是使用它们作为 ftw 函数的回调 这按预期工作 include
  • 在 kotlin 中使用比较器

    我是 kotlin 新手 如何使用比较对象Collections Collections sort list myCustomComparator 我们怎样才能写一个MyCustomComparator科特林中的方法 private fin
  • 印刷撇号 + 宽字符串文字破坏了我的 wofstream (C++)

    我刚刚在处理不祥的印刷撇号 时遇到了一些奇怪的行为 而不是打字机撇号 与宽字符串文字一起使用时 撇号会破坏 wofstream 这段代码有效 ofstream file test txt file lt lt A B file close
  • 将对象作为参数发送给分叉的 Nodejs 进程

    Having fork MyProcess js foo 在主流程中和console log process argv 2 在分叉进程中将记录foo到我的控制台 然而 fork MyProcess js myProp bar 在主流程中和c
  • 颜色条最小值和最大值

    如何手动更改绘图中颜色条的最小值和最大值 例如 如何将下图中颜色条的最小值设置为 0 import plotly express as px import numpy as np df px data gapminder query yea
  • 将结果写入同一 Excel 文件中的 2 个不同工作表中

    你能教我Python是否可以写入同一个Excel文件 但2个不同的电子表格 选项卡 举例来说 我想挑选并写入以下4个网站的标题 并将它们写入同一个文件title xls中 但分别写入其Sheet1和Sheet 2中 www dailynew
  • jQuery - 从值数组中按值选择元素

    给出一些简单的 JSON 62689 62690 62697 我需要在 DOM 中选择与这些值相对应的三个元素 基于value属性 他们可能是一个
  • 处理存储在配置文件中的变量的最佳实践是什么?

    如果我使用配置文件来存储例如站点名称 数据库主机等 处理此问题的最佳实践是什么 sitename stackoverflow com 然后在函数中设置全局 sitename DEFINE SITENAME stackoverflow com
  • wxWidgets的EVT_CHAR_HOOK有什么作用?

    我正在维护一个 wxWidgets C 应用程序 它使用 EVT CHAR HOOK 来捕获高级窗口中的关键事件 我找不到此事件的任何真实文档 但我可以推测它以某种优先于 标准 关键事件的方式拦截关键事件 我刚刚发现的一件令人不安的事情是
  • Angular2 使用 ngFor 绑定数组

    我使用的是 angular2 在我的表单中 我通常创建一个模型类并将我的对象与表单绑定 然后通过 this myObject 进行访问 div class form group div
  • spring data redis主从配置

    以下是我的 jedis 配置 Bean public JedisConnectionFactory getJedisConnectionFactory JedisConnectionFactory jedisConnectionFactor
  • 从包含多个文档的语料库中删除行

    我的语料库中有 4000 个文本文档 作为数据清理的一部分 我想从每个文档中删除包含特定单词的行 例如 library tm doc corpus lt VCorpus DirSource C TextMining Prototype pa
  • iOS 13中的prefersStatusBar隐藏问题

    大家好 我想隐藏我的状态栏 in a View Controller但它似乎不起作用 我使用了该功能 override var prefersStatusBarHidden Bool return true 我还设置了View contro
  • Parse Javascript SDK -- 将客户端 `user` 保存为服务器端 ` Parse.User.current()`

    我可能在概念上做错了事情 所以请告诉我我是否错了 我正在使用 Parse 的 Facebook 登录来登录用户客户端 然后我尝试发布这个user object到我的服务器 这样我就可以在服务器端拥有该用户对象 但我在文档中找不到与此相关的任
  • xcode swift 如何分割图像?

    我正在使用 Swift 2 0 我想将图像分割成多个部分 我知道这是重复的 但它们的语法很旧 我在更新时遇到问题 update Xcode 8 2 1 斯威夫特 3 0 2 您可以添加此扩展来分割图像 extension UIImage v
  • ng 升级命令将 cli 从 v7 升级到 v8 失败

    用于将 cli 版本从 v7 项目更新到 v8 的 ng Upgrade 命令失败 首先手动尝试升级 cli 也会失败 ng update angular cli 您的全局 Angular CLI 版本 8 0 1 高于您的本地版本 版本
  • sklearn RandomForestClassifier 与 auc 方法中 ROC-AUC 分数的差异

    我分别从 sklearn 的 RandomForestClassifier 和 roc curve auc 方法收到不同的 ROC AUC 分数 以下代码得到了 0 878 的 ROC AUC 即 gs best score def tra
  • 斜杠和 python cmd

    我正在尝试使用 cmd 模块来实现 python cmd 我想自动完成文件 所以我实现了一些方法 但是 我看到 complete put self text line begidx endidx 中的文本参数删除了所有 字符 任何人都知道为
  • 如何将 AsParallel 与 async 和 wait 关键字一起使用?

    我正在查看某人的异步示例代码 并注意到其实现方式存在一些问题 在查看代码时 我想知道使用并行方式循环列表是否比正常循环列表更有效 据我所知 性能上的差异非常小 两者都耗尽了每个处理器 并且完成时间都相同 这是第一种方法 var tasks