【问题标题】:Chain two methods into tasks将两种方法链接到任务中
【发布时间】:2017-11-23 13:19:36
【问题描述】:

我正在自学 C# 并努力理解线程、异步等。我正在尝试做一些实践练习来提高我的知识。

我有两种方法:方法 x 和方法 Y

我需要创建一个将运行方法 X 的任务,一旦方法 x 完成,它将运行方法 y。

然后我想在此基础上创建相同的任务 3 次。所以本质上是运行这两种方法的三个不同的任务。

方法是public void。我尝试过这样的事情:

Task[] tasks = new Task[2];
tasks[1] = Task.Run(() => x(n1.ToString()));
tasks[2] = tasks[1].ContinueWith(antecedent => y() ));

【问题讨论】:

  • 如果它们必须按顺序执行,为什么要在 X 和 Y 上执行任务呢?
  • 据我所知,您可以按顺序调用它们。如果你想要不同的行为,那就不清楚了。
  • 三个不同的任务,顺序运行还是并行运行?
  • 如果你的方法是公共的 void Foo(),这不是他们的问题,无论如何都不会同步运行。您不希望它们成为公共任务 Foo()。 (Task 是 void 的异步等价物)

标签: c# multithreading task


【解决方案1】:

如果MethodXMethodY 是:

public async Task MethodX() {}
public async Task MethodY() {}

那么,你可以使用:

await MethodX();
await MethodY();

如果MethodXMethodY 是:

public void MethodX() {}
public void MethodY() {}

那么,你可以使用:

await Task.Run(() => 
{ 
    MethodX();
    MethodY();
}

【讨论】:

    【解决方案2】:

    如果方法是异步的,你可以这样做:

    await MethodX();
    await MethodY();
    

    @无效时编辑

      await Task.Run(() => MethodX());
      await Task.Run(() => MethodY());
    

    【讨论】:

    • 它们是公共空白。我试过类似的东西:Task[] tasks = new Task[2];任务[1] = Task.Run(() => x(n1.ToString()));任务[2] = 任务[1].ContinueWith(antecedent => y() ));
    【解决方案3】:

    您可以创建任务列表,然后在构建集合时定义您的任务:

    List<Task> TasksToDo = new List<Task>();
    
    TasksToDo.AddRange(from item in someCollection.AsEnumerable()
                       select new Task(() => {
                                                MethodX();
                                                MethodY();
                                             }));
    
    TasksToDo.ForEach(x => x.Start());
    Task.WaitAll(TasksToDo.ToArray());
    

    您没有指定您需要它,但如果需要,您可以指定 Task&lt;t&gt; 并声明一个返回类型,以便在全部完成后从 TasksToDo 获取。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多