gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 22:08:18 25 4
gpt4 key购买 nike

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

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

最佳答案

您希望您的 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));
}

关于c# - Task.Factory.StartNew(someMethod(withParam)).continueWith(sameMethod(differentParam)).Wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13482572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com