我在处理多个任务时遇到问题,返回在任务并行库中写入的值。
我的代码如下: 。使用来自第三方的数据创建一组密钥和对象 。它启动该字典中每个键的任务 。在每个任务中,将再次使用与该键相关联的用户对象启动任务集(从上面的步骤2开始) 。执行完所有内部任务后,我想根据返回值更新用户对象。
到目前为止,我已经提出了以下代码:
void ProcessKeys(ExchangeKey eKey)
{
// Create List of Tasks
var retValues = new List<Task<ReturnStatus>>();
// The ContainsKey here is commented out but I have a comparer method which can compare the compound keys
if (TaskProcessor.lstInputsFromUser.Count > 0 )// && TaskProcessor.lstInputsFromUser.ContainsKey(eKey))
{
// Everytime dData will be filled with data from outside world
OrderBook myOrder = new OrderBook();
// Remove the key as the next object will be inserted somewhere else when new data arrives
dData.TryGetValue(eKey, out myOrder);
if (myOrder != null)
{
foreach (var indiElement in TaskProcessor.lstInputsFromUser[eKey])
{
// If the data is already run for the expected number of cycles to total cyles, don't run again
if (indiElement.NoOfCycles != indiElement.TotalNoOfCycles)
{
var singleRetVal = new Task<ReturnStatus>( () => ProcessData(myOrder, indiElement));
singleRetVal.Start();
retValues.Add(singleRetVal);
}
}
}
// Wait till all tasks are completed
// Here also I am facing problem of how to wait on the 1-exchangekey and 5-tasks policy
Task.WaitAll(retValues.ToArray());
var results = retValues.Select(t => t.Result)
.ToList();
if (results != null)
{
Console.WriteLine("Shall print two times only");
foreach (var retResult in results)
{
if (TaskProcessor.ReturnStatusAfterCalc.Keys.Contains(retResult.ID))
{
TaskProcessor.ReturnStatusAfterCalc[retResult.ID] = retResult;
var myObj = TaskProcessor.lstInputsFromUser[eKey].FirstOrDefault(indi => indi.ID == retResult.ID);
if (myObj != null)
{
// Here I am unable to update my original object
myObj.NoOfCycles += retResult.CyclesCompleted;
/// arEvent.Set();
// Task.Run( () => Update database with myObj.NoOfCyles value for the listInputsFromUser[eKey]
}
}
else
{
// TaskProcessor.ReturnStatusAfterCalc[retResult.ID] = new ReturnStatus();
TaskProcessor.ReturnStatusAfterCalc.TryAdd(retResult.ID, retResult);
var myObj = TaskProcessor.lstInputsFromUser[eKey].FirstOrDefault(indi => indi.ID == retResult.ID);
if (myObj != null)
{
// Here I am unable to update my original object
myObj.NoOfCycles += retResult.CyclesCompleted;
// Task.Run( () => Update database with myObj.NoOfCyles value for the listInputsFromUser[eKey]
// arEvent.Set();
}
}
}
}
}
}
主要问题是,代码运行的内部任务多于所需任务。此外,我在使用返回值更新实际对象时遇到问题,因为它不止一次地执行内部任务。
请求任何人帮助我。虽然(true)很糟糕,但我会用Timer附带的set事件替换它。
经过几次评论,我觉得我的例子和解释实际上没有给出问题描述。对不起,麻烦的家伙们。
问题描述: 说我有来自交易所的10个符号。用户1订阅3个符号,用户2订阅7个符号。现在交换将继续发送这10个符号的数据,用户1和用户2将给我一定的价格来下这些10个符号的订单。我将运行10个任务来检查传入的10个符号的价格。稍后用户1还添加剩余的7个符号价格输入。因此,我必须运行13个不同的任务,这些任务需要13个用户对象和10个符号数据,因为每个用户对象可能包含不同的价格和条件
编辑:
在Panagiotis Kanavos的帮助下,我意识到Parallel.ForEach可用于存储返回结果,而不需要任务。这里介绍的主要逻辑和其他不必要的代码将根据评论删除。