foreach循环与任务

时间:2016-12-10 19:08:15

标签: c# .net loops foreach task

我需要使用3个任务创建一个foreach循环,这需要等到所有3个任务完成后再移动到下一个任务。 像

这样的东西
foreach (class r in sets)
{
    Task.Factory.StartNew(() => {
      DoThisFunction1();
    }, TaskCreationOptions.LongRunning);
    Task.Factory.StartNew(() => {
     DoThisFunction2();
    }, TaskCreationOptions.LongRunning);
    Task.Factory.StartNew(() => {
     DoThisFunction3();
    }, TaskCreationOptions.LongRunning);
 }

有人能给出一个简单的方法吗?

2 个答案:

答案 0 :(得分:5)

您可以使用没有返回类型的WaitAll,并在任务上阻止与Wait相似,或WhenAll将返回等待Task

示例:

var tasks = new Task[] {
    Task.Factory.StartNew(() => {
        DoThisFunction1();
    }, TaskCreationOptions.LongRunning),
    Task.Factory.StartNew(() => {
        DoThisFunction2();
    }, TaskCreationOptions.LongRunning),
    Task.Factory.StartNew(() => {
        DoThisFunction3();
    }, TaskCreationOptions.LongRunning)
};

Task.WaitAll(tasks);
// or
await Task.WhenAll(tasks);

可以找到更详细的答案here

答案 1 :(得分:2)

class TasksTest
{
    public void Test()
    {
        List<string> sets = new List<string>
        {
            "set1", "set2", "set3", "set4",
        };

        foreach (var s in sets)
        {
            Console.WriteLine("Set {0}", s);
            var tasks = new[]
            {
                Task.Factory.StartNew(() => {DoThisFunction1();}, TaskCreationOptions.LongRunning),
                Task.Factory.StartNew(() => { DoThisFunction2(); }, TaskCreationOptions.LongRunning),
                Task.Factory.StartNew(() => { DoThisFunction3(); }, TaskCreationOptions.LongRunning),
            };
            Task.WaitAll(tasks);
            Console.WriteLine("End Set {0}\n------------", s);
        }
    }

    void DoThisFunction1()
    {
        Thread.Sleep(1000);
        Console.WriteLine("F1");
    }
    void DoThisFunction2()
    {
        Thread.Sleep(1500);
        Console.WriteLine("F2");
    }
    void DoThisFunction3()
    {
        Thread.Sleep(2000);
        Console.WriteLine("F3");
    }
}