3

4 つのタスクがあり、それぞれが同じメソッドを実行していますが、パラメーターが異なります。各タスクは、データテーブルからデータを読み取っています。

編集:分析に必要なデータが大きすぎて、すべてをメモリにロードできません。したがって、ページングを使用して、より小さなデータ ブロックを取得します。したがって、プロセスは次のようになります。

  1. for loop/task.Factory を使用して X 個のタスクを作成し、各タスクにパラメーターを手動で割り当てます。(私はすでに並列forループを調べました。)

  2. すべてのタスクがデータの最初のページの実行を完了するまで待ちます。

  3. 2 ページ目のデータをデータ テーブルに読み込みます。

  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 つのタスクがあるため、4 つの異なる myList を持つことになります)、またはその値はすべてのタスク間で共有されますか?

4

2 に答える 2

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 に答える
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 に答える