TPL任务返回值

时间:2011-07-21 06:46:07

标签: visual-studio-2010 c#-4.0 task-parallel-library

我有面部识别系统的应用 我从相机框架收到大约30:50帧/秒 这取决于相机类型,对于每个帧我都有其他功能,以便让所有人都可以使用它 并且从当前框架中的所有人中的每个人检查这个人是否存在于数据库中或者数据库记录它是大约100,000个记录,这是我为所有框架做的所有步骤

我用简单的C#语句重写我之前的问题更清楚

// Get All frame from Camera you can consider it's like you are inside for loop
for (int frame = 1; frame < 50; frame++)
{
    // each fram i get the person insied this frame
    // so i get List<Persons>
    foreach (var perosn in allPersons_inFrame)
    {    
        // for each person i need to check 
        //against all my database recored
        foreach (var recored in Database)
        {
            // perosn Exist in Database
            // give me person id
        }
    }
}

直到现在我的应用程序正常运行没有任何问题 但是我有另外一个让我更加简单并且花费较少时间进行比较的dea 当前时间。我需要使用并行编程“TPL” 如何:我需要将数据库记录分成5个部分,每个部分约20,000个记录 并行处理5个部分,等到5个部分完成 并检查是否有任何部分导致这个主要的最终结果

但我不知道如何植入这个想法我希望我的问题很清楚

所以,如果任何人有想法帮助我实施,请 这个想法我将非常感谢他

2 个答案:

答案 0 :(得分:0)

我没有测试,但希望它有所帮助。

// define your logic here.
Func<IEnumerable<Person>, string> YourLogicHere = null;
// define the way to compare your task result here.
Func<IEnumerable<Task<string>>, string> DealWithTheTaskResultsHere = null;
Collection<Person> persons = new Collection<Person>();
Task<string> mainTask = new Task<string>(tmpObj =>
    {
        var tmpPersons = tmpObj as Collection<Person>;
        if (tmpPersons != null)
        {
            int interval = (int)Math.Ceiling(tmpPersons.Count / 5d);
            int index = 0;
            Collection<Task<string>> subTasks = new Collection<Task<string>>();
            while (index < tmpPersons.Count)
            {
                Task<string> subTask = new Task<string>(
                    (tmpSubPersons) => { return YourLogicHere((IEnumerable<Person>)tmpSubPersons); },
                    tmpPersons.Skip(index).Take(interval).ToArray(), TaskCreationOptions.AttachedToParent);
                index += interval;
                subTasks.Add(subTask);
            }

            foreach (var subTask in subTasks)
            {
                subTask.Start();
            }

            foreach (var subTask in subTasks)
            {
                subTask.Wait();
            }

            return DealWithTheTaskResultsHere(subTasks);
        }
        else return String.Empty;
    }, persons);

mainTask.Start();
mainTask.Wait();
return mainTask.Result;

答案 1 :(得分:0)

大家好,关于我之前的问题,我找到了很好的解决方案 我将为每个人分享解决方案 在网上搜索后,我发现了 有许多方法可以对数据源进行分区。在最有效的方法中,多个线程协作处理原始源序列,而不是将源物理地分离成多个子序列。在.NET Framework 4中,有新概念可以动态分区以获取更多信息Here以及为PLINQ配置负载平衡分区程序Click Here

我用简单的C#语句解释我的答案问题更清楚。

// Get All frame from Camera you can consider it's like you are inside for loop
for (int frame = 1; frame < 50; frame++)
{    
  // first enhanced i process all persons in parallel way -- new enhanced

  Parallel.ForEach(allPersons_inFrame, perosn =>
            {

                //second enhanced Partition the entire data source
                var rangePartitioner = Partitioner.Create(0, source.Length);

                 List<results> lstResult=new List<results>();

                //   Loop over  the partitions in parallel. 
                Parallel.ForEach(rangePartitioner, (range, loopState) =>
                {
                    // Loop over each range element without a delegate invocation.
                    for (int i = range.Item1; i < range.Item2; i++)
                    {
                        // make any spacfic check to get you result
                           lstResult.Add( source[i]);
                    }
                });   
            }

}