簡體   English   中英

如何在並行C#中觸發任務列表

[英]how to fire a list of task in parallel c#

用正確的方式並行觸發任務列表,而又忘記了的方式是什么?

我下面的內容使我相信.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());
    }

看起來您對異步性和並行性都感興趣

我建議通過Task(未等待)解決異步性,並通過Parallel.ForEach(..)解決並行性

與為每個職位創建一個任務相比,Parallel.ForEach的性能要高得多,尤其是在有很多職位的情況下,請參見Parallel.ForEach與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());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM