5

次のコードを並列化するための正しい構文は何ですか?

static void Main(string[] args)
{
    Task.Factory.StartNew(
        () =>
            doOne(SelectedTask.option1)
           .ContinueWith(
            task => 
            doOne(SelectedTask.option1)).Wait()
   ); 
}

enum実行するコードを決定する「selectedTask」と同じ方法:

static enum SelectedTask
{
    option1,
    option2
}

static void doOne(SelectedTask Lunch)
{ 
    switch (lunch)
    {
        case SelectedTask.option1:
            Console.WriteLine("option1");
            break;
        case SelectedTask.option2:
            Console.WriteLine("option2");
            break;
        default:
            break;
    }
}
4

2 に答える 2

17

doOne通話を同時に発生させますか?次に、タスクファクトリから直接開始できます。

// Start two concurrent tasks
var task1 = Task.Factory.StartNew(() => doOne(SelectedTask.option1));
var task2 = Task.Factory.StartNew(() => doOne(SelectedTask.option2));

// Block the current thread until all tasks complete
Task.WaitAll(task1, task2);

doOne通話を順番に発生させますか?次に、以下を使用してそれらをチェーンできますContinueWith

// Start a chain of tasks
var task1 = Task.Factory.StartNew(() => doOne(SelectedTask.option1));
var task2 = task1.ContinueWith(t => doOne(SelectedTask.option2));

// Block the current thread until the last task completes
task2.Wait();

投稿のタイトルにあるコード(いくつかの修正を含む)は、基本的に、上記のシーケンシャルタスクチェーンとまったく同じ機能を実行しています。

Task.Factory.StartNew(() => doOne(SelectedTask.option1))
            .ContinueWith(t => doOne(SelectedTask.option2))
            .Wait();

以下の質問に答えてください。

SelectedTasks私が正しく理解していれば、変数リストのタスクを並行して実行できるようにしたいと思います。

List<SelectedTask> selectedTaskOptions = new List<SelectedTask>()
{
    SelectedTask.option1,
    SelectedTask.option2,
    SelectedTask.option3,
    SelectedTask.option4,
    SelectedTask.option5
};

RunAllSelectedTaskOptions(selectedTaskOptions);

RunAllSelectedTaskOptionsのリストを受け入れて実行するにはSelectedTasks

public void RunAllSelectedTaskOptions(List<SelectedTask> selectedTaskOptions)
{
    List<Task> createdTasks = new List<Task>();

    foreach(var taskOption in selectedTaskOptions)
    {
        createdTasks.Add(Task.Factory.CreateNew(() => doOne(taskOption)));
    }

    Task.WaitAll(createdTasks);
}

実装の別の方法は、RunAllSelectedTaskOptionsを使用することParallel.ForEachです。これは並行して実行され、最も遅い/最後の反復が完了するまでブロックされます。

public void RunAllSelectedTaskOptions(List<SelectedTask> selectedTaskOptions)
{
    Parallel.ForEach(selectedTaskOptions, taskOption => doOne(taskOption));
}
于 2012-11-21T06:40:38.227 に答える
1

doOne2 つの呼び出しを並列化することについて話していると思いますか?

その場合、次のようなことを行う必要があります。

var task1 = Task.Factory.StartNew(() => doOne(SelectedTask.option1));
var task2 = Task.Factory.StartNew(() => doOne(SelectedTask.option2));
var taskList = new List<Task>{task1, task2};
Task.WaitAll(taskList);

*上記のコードはかなり正確ですが、構文は検証されていません。

于 2012-11-20T21:42:36.550 に答える