Task.Factory.StartNew(的someMethod(withParam))。continueWith(sameMethod(differentParam))。等待()

时间:2012-11-20 21:34:28

标签: c# .net task-parallel-library

并行化以下代码的正确语法是什么?

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;
    }
}

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

我假设您正在谈论并行化两个doOne来电?

如果是这样,那么你需要做这样的事情:

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);

*上述代码相当准确,但语法尚未经过验证。