【问题标题】:foreach loop with Task [duplicate]带有任务的foreach循环[重复]
【发布时间】:2017-04-26 01:02:02
【问题描述】:

我需要创建一个包含 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);
 }

有人可以提供一个简单的方法来做到这一点吗?

【问题讨论】:

    标签: c# .net loops foreach task


    【解决方案1】:

    您可以使用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

    【讨论】:

    • 这么简单?哇,一直在找这个……谢谢!
    • 顺便说一句,与标准副本相比,这是非常低质量的答案......
    • @AlexeiLevenkov 我应该根据您提供的样本改进它还是因为这是重复的所以这无关紧要?
    • @Dr.Fre 如果您的答案比链接副本中已有的更好 - 确实将其提供给duplicate question,否则我认为不值得您花时间改进这个(本身就很好,只是没有比现有的有用多少)
    【解决方案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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 2023-03-16
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多