如何并行触发任务列表 C#
how to fire a list of task in parallel c#
以一劳永逸的方式并行启动任务列表的正确方法是什么。
下面的内容让我相信 .WhenAll 会一直阻塞,直到全部完成。
我已经放弃了一些这样的东西,我需要学习如何循环和存储所有被调用的函数,然后在所有 运行 的地方同时触发它们,没关系首先或最后调用哪个函数。
正确的做法是什么?
我希望 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());
}
看来你对异步和并行都感兴趣
我会建议通过任务(未等待)解决异步性和 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());
以一劳永逸的方式并行启动任务列表的正确方法是什么。
下面的内容让我相信 .WhenAll 会一直阻塞,直到全部完成。
我已经放弃了一些这样的东西,我需要学习如何循环和存储所有被调用的函数,然后在所有 运行 的地方同时触发它们,没关系首先或最后调用哪个函数。
正确的做法是什么?
我希望 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());
}
看来你对异步和并行都感兴趣
我会建议通过任务(未等待)解决异步性和 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());