0

A、B、Cの3つのタスクがあります。

B は C の前に実行する必要がありますが、A は両方と並行して実行できます。これは最近変更されたロジックであり、現在のロジックは正常に機能します。現在のロジックよりも優れたソリューションがあるかどうか疑問に思いました。

public void RunTasks(...) {
    Action<IRunnableTask> runner = task => 
    {
        if (task.ShouldRun(request))
        {
            task.Run(request, response);
        }
    };

    // run parallel tasks
    Parallel.ForEach(parallelTasks, runner);

    // run serial tasks
    Array.ForEach(serialTasks, runner);
}

ここで、A と B は並列タスクで、C は直列タスクのリストにあります。ここでの問題は、コードが C を開始する前に A が終了するのを待つことです。これは不要です。

それで、きれいな解決策はありますか、それともコールバックなどを入れ始める必要がありますか?

4

4 に答える 4

6

TPL のタスクを利用できます。

タスク B と A を同時に実行し、タスク B の続きとしてタスク C を実行することができます。

例えば

Task.Factory.StartNew(()=>TaskA());
Task.Factory.StartNew(()=>TaskB()).ContinueWith(t=>TaskC(t));

TaskB の続きで、Task を渡して、TaskC メソッドに渡された TaskB の結果を取得できます。

于 2012-07-13T12:32:17.090 に答える
2

並列タスクのリストにタスクを追加して、逐次タスクを次々と実行するのはどうですか?

于 2012-07-13T12:29:47.753 に答える
0

そんな感じ:

Action taskACallback = () => { };
Action taskBCallback = () => { };
Action taskCCallback = () => { };

Task taskA = new Task(taskACallback);
Task taskC = new Task(taskCCallback);
Task taskB = new Task(taskBCallback).ContinueWith(t => taskC.Start());
taskA.Start();
taskB.Start();
于 2012-07-13T12:31:01.973 に答える
0

この程度までコードを編集する際のエチケットがわからないため、sllの回答を少し修正したバージョンです。

Action taskACallback = () => Console.WriteLine ("Task A");
Action taskBCallback = () => Console.WriteLine ("Task B");
Action<Task> taskCCallback = task => Console.WriteLine ("Task C, continued off of task with status {0}", task.Status);

Task taskA = new Task(taskACallback);
Task taskB = new Task(taskBCallback);
Task taskC = taskB.ContinueWith(taskCCallback);
taskA.Start();
taskB.Start();

これにより、次のコンソール出力が得られます。

Task A
Task B
Task C, continued off of task with status RanToCompletion
于 2012-07-13T16:39:10.667 に答える