处理多个任务在任务并行库中返回值

时间:2016-12-30 09:56:14

标签: c# task-parallel-library task return-value

我在处理多个任务时遇到问题,返回在任务并行库中写入的值。

我的代码如下: 。使用来自第三方的数据创建一组密钥和对象 。它启动该字典中每个键的任务 。在每个任务中,将再次使用与该键相关联的用户对象启动任务集(从上面的步骤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可用于存储返回结果,而不需要任务。这里介绍的主要逻辑和其他不必要的代码将根据评论删除。

0 个答案:

没有答案