[英]how to speed up populating a list using TPL(task parallel library) in 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.