C# 带任务的foreach循环

C# 带任务的foreach循环,c#,.net,loops,foreach,task,C#,.net,Loops,Foreach,Task,我需要用3个任务做一个foreach循环,这需要等到所有3个任务都完成,然后移动到下一个任务。 差不多 foreach (class r in sets) { Task.Factory.StartNew(() => { DoThisFunction1(); }, TaskCreationOptions.LongRunning); Task.Factory.StartNew(() => { DoThisFunction2(); },

我需要用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);
 }
有人可以给出一个简单的方法来实现这一点。

您可以使用没有返回类型且将在任务上阻止simular to
Wait
,或者将返回等待的
任务

例如:

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);
更详细的答案可以在

类任务测试中找到
{
公开无效测试()
{
列表集=新列表
{
“set1”、“set2”、“set3”、“set4”,
};
foreach(变量s在集合中)
{
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(任务);
WriteLine(“结束集{0}\n------”,s);
}
}
void DoThisFunction1()
{
睡眠(1000);
控制台写入线(“F1”);
}
void DoThisFunction2()
{
睡眠(1500);
控制台写入线(“F2”);
}
void DoThisFunction3()
{
《睡眠》(2000年);
控制台写入线(“F3”);
}
}

这么简单?哇,我一直在找这个。。。谢谢顺便说一句,与标准副本相比,这是一个非常低质量的答案…@AlexeiLevenkov我是否应该根据您提供的样本进行改进,或者这不重要,因为这是一个副本?@Dr.Fre如果您的答案比链接副本中已有的答案更好,请确实提供给,否则我认为不值得你花时间来改进这个(它本身很好,只是没有比现有的一次有用多少)
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");
    }
}