3

我有 4 个任务,每个任务都运行相同的方法,但参数不同。每个任务都从数据表中读取数据。

编辑:我需要分析的数据太大而无法将其全部加载到内存中。因此,我将使用分页来检索较小的数据块。因此,该过程如下:

  1. 使用 for 循环/task.Factory 创建 X 个任务,并手动将参数分配给每个任务。(我已经研究了并行 for 循环。)

  2. 等到所有任务都运行完第一页数据。

  3. 将第二页数据加载到数据表中。

  4. 相同的 X 任务将重新开始运行新数据

  5. 重复直到从数据库中读取所有数据。

结束编辑

在我转到 sql server 并检索下一页数据之前,我需要一种等待每个任务完成读取数据表中的所有数据的方法。

目前我正在考虑执行以下操作:在我传递给方法的对象(myEntity)中声明2个变量,

1 = 创建的任务数 (myEntity.TaskCount)。

2 = 完成多少任务的计数器 (myEntity.Count)。

public List<int> GetData(object myEntity)
{
    List<int> myList;

    if(rowCounter == myDataTable.Rows.Count)
    {
        myEntity.Count++;

        while(myEntity.Count != myEntity.TaskCount)
        {

        }
         
        //Refill datatable with new data.
        //rowCounter = 0;
    }
    else
    {
        myList = new List<int>();
        
        //Assign the values to each tasks myList.   
    }
    return myList;
}

[问题 1] 如何暂停任务,更新数据表,然后让它们继续?

[问题 2] myList 是特定于任务的(即我有 4 个不同的 myList,因为我有 4 个任务)或者它的值是否会在所有任务之间共享?

4

2 回答 2

1

您可以使用ContinueWithTPL 中的方法来等待所有子任务。
像这样的东西:

var parentTask = new Task(() => {
    new Task(() => YourFunction1(), TaskCreationOptions.AttachedToParent).Start();
    new Task(() => YourFunction2(), TaskCreationOptions.AttachedToParent).Start();
    new Task(() => YourFunction3(), TaskCreationOptions.AttachedToParent).Start();
    new Task(() => YourFunction4(), TaskCreationOptions.AttachedToParent).Start();
});

parentTask.ContinueWith(p => UpdateYourDatabase());

parentTask.Start(); //Start parent that will start its child tasks.
于 2012-11-11T11:36:42.460 回答
1

您可以使用Task.WaitAll(tasks);来等待一系列任务。

只需将每个生成的任务添加到列表中,然后等待它们,然后再转到下一页。

bool moreData = true;
while(moreData){
    // Go get the next page of data ...
    moreData = TryGetNextPage();

    // spin up the tasks
    List<Task> tasks = new List<Tasks>();
    for(int i = 0; i < maxLoops ; i++){
       Task t = Task.Factory.StartNew(() => { // your action } );
       tasks.Add(t);
     }

     Task.WaitAll(tasks.ToArray());
 }
于 2012-11-11T13:22:48.863 回答