【问题标题】:how to fire a list of task in parallel c#如何在并行 c# 中触发任务列表
【发布时间】:2016-06-23 22:59:29
【问题描述】:

什么是他正确的方法来并行触发一个任务列表,然后忘记方式。

下面的内容让我相信 .WhenAll 一直阻塞,直到完成所有操作。

我已经放弃了一些这样的,我需要学习如何循环和存储所有被调用的函数,然后在所有函数同时运行的地方触发它们,不管先调用哪个函数还是最后。

什么是正确的方法?

我希望 MS 能在他们的智能感知中提供更多信息来帮助我们,因为我对异步调用有更多需求,尤其是一次有很多工作调用,而且它们都是一劳永逸的。

这是我现在得到的。

  public async static Task UpdateBayPositionAsync(string cadCNN, string bayPositions)
    {
        List<Task> myTask = new List<Task>();
        string[] bps = bayPositions.Split(',');
        int bID; byte pos;

        for (int i = 0; i < bps.Length; i++)
        {
            bID = int.Parse(bps[i].Split(':')[0].ToString());
            pos = byte.Parse(bps[i].Split(':')[1].ToString());

            myTask.Add(Task.Run(() => { ElevationManagerDL.UpdateBayPosition(cadCNN, bID, pos); }));
        };

        await Task.WhenAll(myTask.ToList());
    }

【问题讨论】:

  • 如果你想要一劳永逸,为什么还要等待任务???编辑:为什么要打扰异步?只需将它们全部推入线程池即可。
  • 您正在从循环外部捕获 bID 和 pos,然后异步使用它们。您很有可能没有发送您期望的参数。在循环中声明它们。
  • 这不是重复的,我是问如何将两者结合起来,而不仅仅是并行。
  • 谁是巨魔,而不是帮助,寻找关于人们的花絮,这不是重复的。并行在此,但要做的是同时运行异步是另一回事。得到一个生活的人!

标签: c# multithreading async-await .net-4.6.1


【解决方案1】:

您似乎对异步性和并行性都感兴趣

我建议通过任务(未等待)解决异步性和使用 Parallel.ForEach(..) 解决并行性

Parallel.ForEach 比为每个位置创建一个任务要高效得多, 尤其是职位多的时候,看Parallel.ForEach vs Task.Factory.StartNew

类似的东西

    public async static Task UpdateBayPositionAsync(string cadCnn, string serializedBayPositions)
    {
        string[] bayPositionsAsStrings = serializedBayPositions.Split(',');
        List<BayPosition> bayPositions = bayPositionsAsStrings.Select(bp => new BayPosition(cadCnn, bp)).ToList();

        Task.Factory.StartNew( () => Parallel.ForEach(bayPositions, item => item.Update()));
    }

    public class BayPosition
    {
        public int BId { get; private set; }
        public byte Pos { get; private set; }
        public string CadCnn { get; private set; }

        public BayPosition(string cadCnn, string bayPosition)
        {
            string[] parameters = bayPosition.Split(':');
            BId = Int32.Parse(parameters[0]);
            Pos = Byte.Parse(parameters[1]);
            CadCnn = cadCnn;
        }

        public void Update()
        {
            ElevationManagerDL.UpdateBayPosition(CadCnn, BId, Pos);
        }
    }

如果您只想要并行性并且想要阻塞直到所有更新都运行,那么您只需替换:

        Task.Factory.StartNew( () => Parallel.ForEach(bayPositions, item => item.Update()));

        Parallel.ForEach(bayPositions, item => item.Update());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-23
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多