2016-06-23 7 views
0

Каков был бы он правильный способ запустить список задач параллельно в режиме огня и забыть.Как запустить список задач параллельно C#

То, что у меня есть, заставляет меня поверить в это. Когда Все блокируется, пока все не будет сделано.

У меня есть некоторые, подобные этим, мне нужно научиться цитировать и хранить все вызываемые функции, а затем увольнять их, когда все они запускаются одновременно, неважно, какая функция сначала вызвана или последний.

Каков правильный подход для этого?

Желаю, чтобы MS поместила в их intellisense немного больше информации, чтобы помочь нам, потому что у меня есть больше потребностей в асинхронных вызовах, особенно много рабочих вызовов за один раз, и они все стреляют и забывают.

Вот что у меня есть.

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()); 
    } 
+0

Возможный дубликат [Запуск двух задач асинхронными параллельно и собирать результаты в .NET 4.5] (http://stackoverflow.com/questions/12343081/run-two-async-tasks-in-parallel-and-collect-results-in-net-4-5) –

+3

Если вы хотите пожара и забыть, почему вы ждете задач? Изменить: зачем беспокоиться о async? Просто встряхните их все в поток. – leppie

+0

Вы захватываете bID и pos из-за пределов цикла, а затем используете их асинхронно. Существует реальная вероятность того, что вы не отправляете параметры, которые вы ожидаете. Объявите их внутри цикла. – spender

ответ

0

Похоже, что вы заинтересованы в обоих асинхронности и параллельности

Я рекомендовал бы решить асинхронность с помощью Task (не ожидал) и параллелизм с 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()); 
Смежные вопросы