Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Task.Factory.StartNew(someMethod(withParam)).continueWith(sameMethod(differentParam)).Wait()_C#_.net_Task Parallel Library - Fatal编程技术网

C# Task.Factory.StartNew(someMethod(withParam)).continueWith(sameMethod(differentParam)).Wait()

C# Task.Factory.StartNew(someMethod(withParam)).continueWith(sameMethod(differentParam)).Wait(),c#,.net,task-parallel-library,C#,.net,Task Parallel Library,并行化以下代码的正确语法是什么 static void Main(string[] args) { Task.Factory.StartNew( () => doOne(SelectedTask.option1) .ContinueWith( task => doOne(SelectedTask.option1)).Wait() ); } 使用与枚举相同的

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

static void Main(string[] args)
{
    Task.Factory.StartNew(
        () =>
            doOne(SelectedTask.option1)
           .ContinueWith(
            task => 
            doOne(SelectedTask.option1)).Wait()
   ); 
}
使用与枚举相同的方法“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;
    }
}

我想你说的是将两个
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);
var task1=Task.Factory.StartNew(()=>doOne(SelectedTask.option1));
var task2=Task.Factory.StartNew(()=>doOne(SelectedTask.option2));
var taskList=新列表{task1,task2};
Task.WaitAll(任务列表);

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

是否希望
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
的方法是使用
Parallel.ForEach
,它将并行执行并将阻塞,直到最慢/最后一次迭代完成:

public void RunAllSelectedTaskOptions(List<SelectedTask> selectedTaskOptions)
{
    Parallel.ForEach(selectedTaskOptions, taskOption => doOne(taskOption));
}
public void运行所有selectedTaskOptions(列出selectedTaskOptions)
{
Parallel.ForEach(selectedTaskOptions,taskOption=>doOne(taskOption));
}

所以我猜
任务.Factory
仅限于空(无参数)方法,并且使用列表的行为方式与
任务.Factory.StartNew()
相同,唯一不同的是答案中的代码允许您将参数传递给方法?唯一没有准确的是ToArray()在WaitAll上…参数只能是数组而不是list@LoneXcoder您可以通过闭包传递参数(但应谨慎),也可以通过StartNew操作的通用版本传递参数:非常感谢,它(答案中的最后一个示例)也接受传递给
doOne()的参数,仅…不是通过并行执行,而是在一行优雅的代码中,最后一个问题,如果我可以问的话,并行运行任务的唯一选项是第一个示例?它用单独的声明声明每个任务,然后执行
task.WaitAll()
对所有任务,你知道一种优雅的方法来获取一个包含5-10个方法的类,比如(option1,2,3,4…)并执行这些方法,future至少有10个(不管是否在一个类中(如果我们选择的话,可以)可以吗?看起来很好,我会检查一下!!(你知道我使用枚举作为参数选择器…)抱歉,我忘了我在帖子中写了所有代码…包括枚举(:
public void RunAllSelectedTaskOptions(List<SelectedTask> selectedTaskOptions)
{
    Parallel.ForEach(selectedTaskOptions, taskOption => doOne(taskOption));
}