Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 向嵌入式循环序列添加ETA_C#_.net_Datetime_.net Core - Fatal编程技术网

C# 向嵌入式循环序列添加ETA

C# 向嵌入式循环序列添加ETA,c#,.net,datetime,.net-core,C#,.net,Datetime,.net Core,更新1: using System; using System.Threading; namespace time_remaining_loop_strip { class Program { static void Main(string[] args) { var random = new Random(); Console.Clear(); // Simulate i

更新1:

using System;
using System.Threading;

namespace time_remaining_loop_strip
{
    class Program
    {
        static void Main(string[] args)
        {
            var random = new Random();
            Console.Clear();

            // Simulate initiation delay
            Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));

            int intCount = random.Next(1, 10);

            for (int loop1 = 0; loop1 <= intCount; loop1++) 
            {
                // Simulate loop1 delay
                Console.WriteLine("\tloop1");
                Thread.Sleep(random.Next(100, 1000));

                for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                {
                    // Simulate loop2 delay
                    Console.WriteLine("\t\tloop2");
                    Thread.Sleep(random.Next(100, 1000));

                    for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                    {
                        // Simulate loop3 delay
                        Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(random.Next(100, 1000));

                        for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                        {
                            // Simulate loop4 delay
                            Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(random.Next(100, 1000));
                        }
                    }
                }
            }
        }
    }
}
using System;
using System.Threading;

namespace time_remaining
{
    class Program
    {
        public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
            current.count - start.count == 0
            ? TimeSpan.MaxValue
            : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));

        static void Main(string[] args)
        {
            Console.Clear();

            var random = new Random();
            int Count = random.Next(10, 60);
            DateTime startTime = DateTime.Now;

            for (int i = 0; i <= Count; i++)
            {
                Thread.Sleep(random.Next(100, 2000));
                TimeSpan timeRemaining = ComputeRemaining((0, startTime), (i, DateTime.Now), Count);

                Console.SetCursorPosition(0,0);
                Console.Write("ETA: ");
                Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
            }
        }
    }
}
using System;
using System.Threading;

namespace time_remaining_loop_strip
{
    class Program
    {
        public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
            current.count - start.count == 0
            ? TimeSpan.MaxValue
            : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));

        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
            
            var random = new Random();
            Console.Clear();

            // Simulate initiation delay
            //Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));

            int intCount = random.Next(1, 10);

            for (int loop1 = 0; loop1 <= intCount; loop1++) 
            {
                // Simulate loop1 delay
                //Console.WriteLine("\tloop1");
                Thread.Sleep(random.Next(100, 1000));

                for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                {
                    // Simulate loop2 delay
                    //Console.WriteLine("\t\tloop2");
                    Thread.Sleep(random.Next(100, 1000));

                    for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                    {
                        // Simulate loop3 delay
                        //Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(random.Next(100, 1000));

                        for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                        {
                            // Simulate loop4 delay
                            //Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(random.Next(100, 1000));
                        }
                    }
                }

                TimeSpan timeRemaining = ComputeRemaining((0, startTime), (loop1, DateTime.Now), intCount);

                Console.SetCursorPosition(0,0);
                Console.Write("ETA: ");
                Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
            }
        }
    }
}
 class Program
 {

    static void Main(string[] args)
    {
        DateTime startTime = DateTime.Now;

        var random = new Random();
        Console.Clear();

        // Simulate initiation delay
        //Console.WriteLine("initiate");
        Thread.Sleep(random.Next(100, 1000));

        int firstLoopCount =  random.Next(1, 10);
        int secondLoopCount = random.Next(1, 10);
        int thirdLoopCount = random.Next(1, 10);
        int fourthLoopCount = random.Next(1, 10);

        int firstLoopSleepTime = random.Next(100, 1000);
        int secondLoopSleepTime =random.Next(100, 1000);
        int thirdLoopSleepTime = random.Next(100, 1000);
        int fourthLoopSleepTime = random.Next(100, 1000);
        //**************Added 1 because loop is starting from 0 and ending with different loops count including itself.
        var totalTimeinMillSec = GetTotoalTimeinMilliSecond(firstLoopCount + 1, secondLoopCount + 1, thirdLoopCount + 1, fourthLoopCount + 1, firstLoopSleepTime, secondLoopSleepTime, thirdLoopSleepTime, fourthLoopSleepTime);

        PrintAndGetTimeRemaining(totalTimeinMillSec);        
        for (int loop1 = 0; loop1 <= firstLoopCount; loop1++)
        {
            // Simulate loop1 delay
            //Console.WriteLine("\tloop1");

            Thread.Sleep(firstLoopSleepTime);
            totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - firstLoopSleepTime);
            
            for (int loop2 = 0; loop2 <= secondLoopCount; loop2++)
            {
                // Simulate loop2 delay
                //Console.WriteLine("\t\tloop2");
                Thread.Sleep(secondLoopSleepTime);                   
                totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - secondLoopSleepTime);
                for (int loop3 = 0; loop3 <= thirdLoopCount; loop3++)
                {
                    // Simulate loop3 delay
                    //Console.WriteLine("\t\t\tloop3");
                    Thread.Sleep(thirdLoopSleepTime);                      
                    totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - thirdLoopSleepTime);
                    for (int loop4 = 0; loop4 <= fourthLoopCount; loop4++)
                    {
                        // Simulate loop4 delay
                        //Console.WriteLine("\t\t\t\tloop4");
                        Thread.Sleep(fourthLoopSleepTime);                           
                        totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - fourthLoopSleepTime);
                    }
                }
            }
        }
    }

    private static int PrintAndGetTimeRemaining(int totalTimeinMillSec)
    {
        TimeSpan timeRemaining = TimeSpan.FromMilliseconds(totalTimeinMillSec);

        Console.SetCursorPosition(0, 0);
        Console.WriteLine("ETA: ");
        Console.WriteLine(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds, {4} Milliseconds", timeRemaining.Days.ToString().PadLeft(3, '0'), timeRemaining.Hours.ToString().PadLeft(2, '0'), timeRemaining.Minutes.ToString().PadLeft(2, '0'), timeRemaining.Seconds.ToString().PadLeft(2, '0'), timeRemaining.Milliseconds.ToString().PadLeft(2, '0')));
        return totalTimeinMillSec;
    }

    private static int GetTotoalTimeinMilliSecond(int firstLoopCount, int secondLoopCount, int thirdLoopCount, int fourthLoopCount, int firstLoopSleepTime, int secondLoopSleepTime, int thirdLoopSleepTime, int fourthLoopSleepTime)
    {
        var totalTime = (firstLoopCount * firstLoopSleepTime +
                                  firstLoopCount * secondLoopCount * secondLoopSleepTime +
                                  firstLoopCount * secondLoopCount * thirdLoopCount * thirdLoopSleepTime +
                                  firstLoopCount * secondLoopCount * thirdLoopCount * fourthLoopCount * fourthLoopSleepTime);
        
        return totalTime;
    }

}


}
下面提供的一些解决方案似乎不错。但是,我只知道一个循环在其父循环的迭代次数确定之后将迭代的次数。所以我不能预先计算所有的迭代次数

原始问题:

using System;
using System.Threading;

namespace time_remaining_loop_strip
{
    class Program
    {
        static void Main(string[] args)
        {
            var random = new Random();
            Console.Clear();

            // Simulate initiation delay
            Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));

            int intCount = random.Next(1, 10);

            for (int loop1 = 0; loop1 <= intCount; loop1++) 
            {
                // Simulate loop1 delay
                Console.WriteLine("\tloop1");
                Thread.Sleep(random.Next(100, 1000));

                for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                {
                    // Simulate loop2 delay
                    Console.WriteLine("\t\tloop2");
                    Thread.Sleep(random.Next(100, 1000));

                    for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                    {
                        // Simulate loop3 delay
                        Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(random.Next(100, 1000));

                        for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                        {
                            // Simulate loop4 delay
                            Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(random.Next(100, 1000));
                        }
                    }
                }
            }
        }
    }
}
using System;
using System.Threading;

namespace time_remaining
{
    class Program
    {
        public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
            current.count - start.count == 0
            ? TimeSpan.MaxValue
            : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));

        static void Main(string[] args)
        {
            Console.Clear();

            var random = new Random();
            int Count = random.Next(10, 60);
            DateTime startTime = DateTime.Now;

            for (int i = 0; i <= Count; i++)
            {
                Thread.Sleep(random.Next(100, 2000));
                TimeSpan timeRemaining = ComputeRemaining((0, startTime), (i, DateTime.Now), Count);

                Console.SetCursorPosition(0,0);
                Console.Write("ETA: ");
                Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
            }
        }
    }
}
using System;
using System.Threading;

namespace time_remaining_loop_strip
{
    class Program
    {
        public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
            current.count - start.count == 0
            ? TimeSpan.MaxValue
            : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));

        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
            
            var random = new Random();
            Console.Clear();

            // Simulate initiation delay
            //Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));

            int intCount = random.Next(1, 10);

            for (int loop1 = 0; loop1 <= intCount; loop1++) 
            {
                // Simulate loop1 delay
                //Console.WriteLine("\tloop1");
                Thread.Sleep(random.Next(100, 1000));

                for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                {
                    // Simulate loop2 delay
                    //Console.WriteLine("\t\tloop2");
                    Thread.Sleep(random.Next(100, 1000));

                    for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                    {
                        // Simulate loop3 delay
                        //Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(random.Next(100, 1000));

                        for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                        {
                            // Simulate loop4 delay
                            //Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(random.Next(100, 1000));
                        }
                    }
                }

                TimeSpan timeRemaining = ComputeRemaining((0, startTime), (loop1, DateTime.Now), intCount);

                Console.SetCursorPosition(0,0);
                Console.Write("ETA: ");
                Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
            }
        }
    }
}
 class Program
 {

    static void Main(string[] args)
    {
        DateTime startTime = DateTime.Now;

        var random = new Random();
        Console.Clear();

        // Simulate initiation delay
        //Console.WriteLine("initiate");
        Thread.Sleep(random.Next(100, 1000));

        int firstLoopCount =  random.Next(1, 10);
        int secondLoopCount = random.Next(1, 10);
        int thirdLoopCount = random.Next(1, 10);
        int fourthLoopCount = random.Next(1, 10);

        int firstLoopSleepTime = random.Next(100, 1000);
        int secondLoopSleepTime =random.Next(100, 1000);
        int thirdLoopSleepTime = random.Next(100, 1000);
        int fourthLoopSleepTime = random.Next(100, 1000);
        //**************Added 1 because loop is starting from 0 and ending with different loops count including itself.
        var totalTimeinMillSec = GetTotoalTimeinMilliSecond(firstLoopCount + 1, secondLoopCount + 1, thirdLoopCount + 1, fourthLoopCount + 1, firstLoopSleepTime, secondLoopSleepTime, thirdLoopSleepTime, fourthLoopSleepTime);

        PrintAndGetTimeRemaining(totalTimeinMillSec);        
        for (int loop1 = 0; loop1 <= firstLoopCount; loop1++)
        {
            // Simulate loop1 delay
            //Console.WriteLine("\tloop1");

            Thread.Sleep(firstLoopSleepTime);
            totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - firstLoopSleepTime);
            
            for (int loop2 = 0; loop2 <= secondLoopCount; loop2++)
            {
                // Simulate loop2 delay
                //Console.WriteLine("\t\tloop2");
                Thread.Sleep(secondLoopSleepTime);                   
                totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - secondLoopSleepTime);
                for (int loop3 = 0; loop3 <= thirdLoopCount; loop3++)
                {
                    // Simulate loop3 delay
                    //Console.WriteLine("\t\t\tloop3");
                    Thread.Sleep(thirdLoopSleepTime);                      
                    totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - thirdLoopSleepTime);
                    for (int loop4 = 0; loop4 <= fourthLoopCount; loop4++)
                    {
                        // Simulate loop4 delay
                        //Console.WriteLine("\t\t\t\tloop4");
                        Thread.Sleep(fourthLoopSleepTime);                           
                        totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - fourthLoopSleepTime);
                    }
                }
            }
        }
    }

    private static int PrintAndGetTimeRemaining(int totalTimeinMillSec)
    {
        TimeSpan timeRemaining = TimeSpan.FromMilliseconds(totalTimeinMillSec);

        Console.SetCursorPosition(0, 0);
        Console.WriteLine("ETA: ");
        Console.WriteLine(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds, {4} Milliseconds", timeRemaining.Days.ToString().PadLeft(3, '0'), timeRemaining.Hours.ToString().PadLeft(2, '0'), timeRemaining.Minutes.ToString().PadLeft(2, '0'), timeRemaining.Seconds.ToString().PadLeft(2, '0'), timeRemaining.Milliseconds.ToString().PadLeft(2, '0')));
        return totalTimeinMillSec;
    }

    private static int GetTotoalTimeinMilliSecond(int firstLoopCount, int secondLoopCount, int thirdLoopCount, int fourthLoopCount, int firstLoopSleepTime, int secondLoopSleepTime, int thirdLoopSleepTime, int fourthLoopSleepTime)
    {
        var totalTime = (firstLoopCount * firstLoopSleepTime +
                                  firstLoopCount * secondLoopCount * secondLoopSleepTime +
                                  firstLoopCount * secondLoopCount * thirdLoopCount * thirdLoopSleepTime +
                                  firstLoopCount * secondLoopCount * thirdLoopCount * fourthLoopCount * fourthLoopSleepTime);
        
        return totalTime;
    }

}


}
我在程序中嵌入了类似以下内容的循环:

Prog1:

using System;
using System.Threading;

namespace time_remaining_loop_strip
{
    class Program
    {
        static void Main(string[] args)
        {
            var random = new Random();
            Console.Clear();

            // Simulate initiation delay
            Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));

            int intCount = random.Next(1, 10);

            for (int loop1 = 0; loop1 <= intCount; loop1++) 
            {
                // Simulate loop1 delay
                Console.WriteLine("\tloop1");
                Thread.Sleep(random.Next(100, 1000));

                for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                {
                    // Simulate loop2 delay
                    Console.WriteLine("\t\tloop2");
                    Thread.Sleep(random.Next(100, 1000));

                    for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                    {
                        // Simulate loop3 delay
                        Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(random.Next(100, 1000));

                        for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                        {
                            // Simulate loop4 delay
                            Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(random.Next(100, 1000));
                        }
                    }
                }
            }
        }
    }
}
using System;
using System.Threading;

namespace time_remaining
{
    class Program
    {
        public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
            current.count - start.count == 0
            ? TimeSpan.MaxValue
            : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));

        static void Main(string[] args)
        {
            Console.Clear();

            var random = new Random();
            int Count = random.Next(10, 60);
            DateTime startTime = DateTime.Now;

            for (int i = 0; i <= Count; i++)
            {
                Thread.Sleep(random.Next(100, 2000));
                TimeSpan timeRemaining = ComputeRemaining((0, startTime), (i, DateTime.Now), Count);

                Console.SetCursorPosition(0,0);
                Console.Write("ETA: ");
                Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
            }
        }
    }
}
using System;
using System.Threading;

namespace time_remaining_loop_strip
{
    class Program
    {
        public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
            current.count - start.count == 0
            ? TimeSpan.MaxValue
            : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));

        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
            
            var random = new Random();
            Console.Clear();

            // Simulate initiation delay
            //Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));

            int intCount = random.Next(1, 10);

            for (int loop1 = 0; loop1 <= intCount; loop1++) 
            {
                // Simulate loop1 delay
                //Console.WriteLine("\tloop1");
                Thread.Sleep(random.Next(100, 1000));

                for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                {
                    // Simulate loop2 delay
                    //Console.WriteLine("\t\tloop2");
                    Thread.Sleep(random.Next(100, 1000));

                    for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                    {
                        // Simulate loop3 delay
                        //Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(random.Next(100, 1000));

                        for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                        {
                            // Simulate loop4 delay
                            //Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(random.Next(100, 1000));
                        }
                    }
                }

                TimeSpan timeRemaining = ComputeRemaining((0, startTime), (loop1, DateTime.Now), intCount);

                Console.SetCursorPosition(0,0);
                Console.Write("ETA: ");
                Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
            }
        }
    }
}
 class Program
 {

    static void Main(string[] args)
    {
        DateTime startTime = DateTime.Now;

        var random = new Random();
        Console.Clear();

        // Simulate initiation delay
        //Console.WriteLine("initiate");
        Thread.Sleep(random.Next(100, 1000));

        int firstLoopCount =  random.Next(1, 10);
        int secondLoopCount = random.Next(1, 10);
        int thirdLoopCount = random.Next(1, 10);
        int fourthLoopCount = random.Next(1, 10);

        int firstLoopSleepTime = random.Next(100, 1000);
        int secondLoopSleepTime =random.Next(100, 1000);
        int thirdLoopSleepTime = random.Next(100, 1000);
        int fourthLoopSleepTime = random.Next(100, 1000);
        //**************Added 1 because loop is starting from 0 and ending with different loops count including itself.
        var totalTimeinMillSec = GetTotoalTimeinMilliSecond(firstLoopCount + 1, secondLoopCount + 1, thirdLoopCount + 1, fourthLoopCount + 1, firstLoopSleepTime, secondLoopSleepTime, thirdLoopSleepTime, fourthLoopSleepTime);

        PrintAndGetTimeRemaining(totalTimeinMillSec);        
        for (int loop1 = 0; loop1 <= firstLoopCount; loop1++)
        {
            // Simulate loop1 delay
            //Console.WriteLine("\tloop1");

            Thread.Sleep(firstLoopSleepTime);
            totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - firstLoopSleepTime);
            
            for (int loop2 = 0; loop2 <= secondLoopCount; loop2++)
            {
                // Simulate loop2 delay
                //Console.WriteLine("\t\tloop2");
                Thread.Sleep(secondLoopSleepTime);                   
                totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - secondLoopSleepTime);
                for (int loop3 = 0; loop3 <= thirdLoopCount; loop3++)
                {
                    // Simulate loop3 delay
                    //Console.WriteLine("\t\t\tloop3");
                    Thread.Sleep(thirdLoopSleepTime);                      
                    totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - thirdLoopSleepTime);
                    for (int loop4 = 0; loop4 <= fourthLoopCount; loop4++)
                    {
                        // Simulate loop4 delay
                        //Console.WriteLine("\t\t\t\tloop4");
                        Thread.Sleep(fourthLoopSleepTime);                           
                        totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - fourthLoopSleepTime);
                    }
                }
            }
        }
    }

    private static int PrintAndGetTimeRemaining(int totalTimeinMillSec)
    {
        TimeSpan timeRemaining = TimeSpan.FromMilliseconds(totalTimeinMillSec);

        Console.SetCursorPosition(0, 0);
        Console.WriteLine("ETA: ");
        Console.WriteLine(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds, {4} Milliseconds", timeRemaining.Days.ToString().PadLeft(3, '0'), timeRemaining.Hours.ToString().PadLeft(2, '0'), timeRemaining.Minutes.ToString().PadLeft(2, '0'), timeRemaining.Seconds.ToString().PadLeft(2, '0'), timeRemaining.Milliseconds.ToString().PadLeft(2, '0')));
        return totalTimeinMillSec;
    }

    private static int GetTotoalTimeinMilliSecond(int firstLoopCount, int secondLoopCount, int thirdLoopCount, int fourthLoopCount, int firstLoopSleepTime, int secondLoopSleepTime, int thirdLoopSleepTime, int fourthLoopSleepTime)
    {
        var totalTime = (firstLoopCount * firstLoopSleepTime +
                                  firstLoopCount * secondLoopCount * secondLoopSleepTime +
                                  firstLoopCount * secondLoopCount * thirdLoopCount * thirdLoopSleepTime +
                                  firstLoopCount * secondLoopCount * thirdLoopCount * fourthLoopCount * fourthLoopSleepTime);
        
        return totalTime;
    }

}


}
使用系统;
使用系统线程;
命名空间时间\u剩余\u循环\u条
{
班级计划
{
静态void Main(字符串[]参数)
{
var random=新的random();
Console.Clear();
//模拟启动延迟
控制台写入线(“启动”);
Sleep(random.Next(1001000));
intCount=random.Next(1,10);

对于(int loop1=0;loop1,您可以知道(t)循环4(L4)将执行多少次乘以L1tL2tL3t*L4t=total

dt = DateTime.Now;
count = 0L;
现在在L4中增加计数并计算经过的时间

et= DateTime.Now - dt;
count++;
在这里,使用三的规则,你可以计算到达总迭代还有多少秒

remainingSeconds = (total*et.TotalSeconds/count) - et.TotalSeconds;
现在埃塔是

DateTime.Now.AddSeconds(remainingSeconds);

我用下面的逻辑来解决这个问题

  • 在第一次foreach每个循环之前,我计算了所有不同循环的计数

  • 之后,我创建了4个不同的变量来保存每个循环的睡眠时间,每个循环中都有设置

  • 现在,在第一个for循环之前,我使用以下逻辑计算了所有循环将花费的总时间(以毫秒为单位):

    var totalTime=(firstLoopCount*firstLoopSleepTime)+ (firstLoopCount*secondLoopCount*secondLoopSleepTime)+ (第一次循环计数*第二次循环计数*第三次循环计数*第三次循环睡眠时间)+ (第一次循环计数*第二次循环计数*第三次循环计数*第四次循环计数*第四次循环睡眠时间);

  • 注意:我在传递循环计数的函数调用(GetToAltimeinMilliSecond)中添加了1,因为循环从0开始,以不同的循环计数结束,包括循环本身

  • 现在在循环开始之前,打印所用的总时间
  • 在每个循环中,线程睡眠后,从总时间中减去线程睡眠时间并打印出来。然后将新计算的时间设置为总时间
  • 在每个循环内重复此操作
  • 下面是代码:

    using System;
    using System.Threading;
    
    namespace time_remaining_loop_strip
    {
        class Program
        {
            static void Main(string[] args)
            {
                var random = new Random();
                Console.Clear();
    
                // Simulate initiation delay
                Console.WriteLine("initiate");
                Thread.Sleep(random.Next(100, 1000));
    
                int intCount = random.Next(1, 10);
    
                for (int loop1 = 0; loop1 <= intCount; loop1++) 
                {
                    // Simulate loop1 delay
                    Console.WriteLine("\tloop1");
                    Thread.Sleep(random.Next(100, 1000));
    
                    for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                    {
                        // Simulate loop2 delay
                        Console.WriteLine("\t\tloop2");
                        Thread.Sleep(random.Next(100, 1000));
    
                        for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                        {
                            // Simulate loop3 delay
                            Console.WriteLine("\t\t\tloop3");
                            Thread.Sleep(random.Next(100, 1000));
    
                            for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                            {
                                // Simulate loop4 delay
                                Console.WriteLine("\t\t\t\tloop4");
                                Thread.Sleep(random.Next(100, 1000));
                            }
                        }
                    }
                }
            }
        }
    }
    
    using System;
    using System.Threading;
    
    namespace time_remaining
    {
        class Program
        {
            public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
                current.count - start.count == 0
                ? TimeSpan.MaxValue
                : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));
    
            static void Main(string[] args)
            {
                Console.Clear();
    
                var random = new Random();
                int Count = random.Next(10, 60);
                DateTime startTime = DateTime.Now;
    
                for (int i = 0; i <= Count; i++)
                {
                    Thread.Sleep(random.Next(100, 2000));
                    TimeSpan timeRemaining = ComputeRemaining((0, startTime), (i, DateTime.Now), Count);
    
                    Console.SetCursorPosition(0,0);
                    Console.Write("ETA: ");
                    Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
                }
            }
        }
    }
    
    using System;
    using System.Threading;
    
    namespace time_remaining_loop_strip
    {
        class Program
        {
            public static TimeSpan ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end) =>
                current.count - start.count == 0
                ? TimeSpan.MaxValue
                : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));
    
            static void Main(string[] args)
            {
                DateTime startTime = DateTime.Now;
                
                var random = new Random();
                Console.Clear();
    
                // Simulate initiation delay
                //Console.WriteLine("initiate");
                Thread.Sleep(random.Next(100, 1000));
    
                int intCount = random.Next(1, 10);
    
                for (int loop1 = 0; loop1 <= intCount; loop1++) 
                {
                    // Simulate loop1 delay
                    //Console.WriteLine("\tloop1");
                    Thread.Sleep(random.Next(100, 1000));
    
                    for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++) 
                    {
                        // Simulate loop2 delay
                        //Console.WriteLine("\t\tloop2");
                        Thread.Sleep(random.Next(100, 1000));
    
                        for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++) 
                        {
                            // Simulate loop3 delay
                            //Console.WriteLine("\t\t\tloop3");
                            Thread.Sleep(random.Next(100, 1000));
    
                            for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++) 
                            {
                                // Simulate loop4 delay
                                //Console.WriteLine("\t\t\t\tloop4");
                                Thread.Sleep(random.Next(100, 1000));
                            }
                        }
                    }
    
                    TimeSpan timeRemaining = ComputeRemaining((0, startTime), (loop1, DateTime.Now), intCount);
    
                    Console.SetCursorPosition(0,0);
                    Console.Write("ETA: ");
                    Console.Write(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds", timeRemaining.Days.ToString().PadLeft(3,'0'), timeRemaining.Hours.ToString().PadLeft(2,'0'), timeRemaining.Minutes.ToString().PadLeft(2,'0'), timeRemaining.Seconds.ToString().PadLeft(2,'0')));
                }
            }
        }
    }
    
     class Program
     {
    
        static void Main(string[] args)
        {
            DateTime startTime = DateTime.Now;
    
            var random = new Random();
            Console.Clear();
    
            // Simulate initiation delay
            //Console.WriteLine("initiate");
            Thread.Sleep(random.Next(100, 1000));
    
            int firstLoopCount =  random.Next(1, 10);
            int secondLoopCount = random.Next(1, 10);
            int thirdLoopCount = random.Next(1, 10);
            int fourthLoopCount = random.Next(1, 10);
    
            int firstLoopSleepTime = random.Next(100, 1000);
            int secondLoopSleepTime =random.Next(100, 1000);
            int thirdLoopSleepTime = random.Next(100, 1000);
            int fourthLoopSleepTime = random.Next(100, 1000);
            //**************Added 1 because loop is starting from 0 and ending with different loops count including itself.
            var totalTimeinMillSec = GetTotoalTimeinMilliSecond(firstLoopCount + 1, secondLoopCount + 1, thirdLoopCount + 1, fourthLoopCount + 1, firstLoopSleepTime, secondLoopSleepTime, thirdLoopSleepTime, fourthLoopSleepTime);
    
            PrintAndGetTimeRemaining(totalTimeinMillSec);        
            for (int loop1 = 0; loop1 <= firstLoopCount; loop1++)
            {
                // Simulate loop1 delay
                //Console.WriteLine("\tloop1");
    
                Thread.Sleep(firstLoopSleepTime);
                totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - firstLoopSleepTime);
                
                for (int loop2 = 0; loop2 <= secondLoopCount; loop2++)
                {
                    // Simulate loop2 delay
                    //Console.WriteLine("\t\tloop2");
                    Thread.Sleep(secondLoopSleepTime);                   
                    totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - secondLoopSleepTime);
                    for (int loop3 = 0; loop3 <= thirdLoopCount; loop3++)
                    {
                        // Simulate loop3 delay
                        //Console.WriteLine("\t\t\tloop3");
                        Thread.Sleep(thirdLoopSleepTime);                      
                        totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - thirdLoopSleepTime);
                        for (int loop4 = 0; loop4 <= fourthLoopCount; loop4++)
                        {
                            // Simulate loop4 delay
                            //Console.WriteLine("\t\t\t\tloop4");
                            Thread.Sleep(fourthLoopSleepTime);                           
                            totalTimeinMillSec = PrintAndGetTimeRemaining(totalTimeinMillSec - fourthLoopSleepTime);
                        }
                    }
                }
            }
        }
    
        private static int PrintAndGetTimeRemaining(int totalTimeinMillSec)
        {
            TimeSpan timeRemaining = TimeSpan.FromMilliseconds(totalTimeinMillSec);
    
            Console.SetCursorPosition(0, 0);
            Console.WriteLine("ETA: ");
            Console.WriteLine(String.Format("{0} Days, {1} Hours, {2} Minutes, {3} Seconds, {4} Milliseconds", timeRemaining.Days.ToString().PadLeft(3, '0'), timeRemaining.Hours.ToString().PadLeft(2, '0'), timeRemaining.Minutes.ToString().PadLeft(2, '0'), timeRemaining.Seconds.ToString().PadLeft(2, '0'), timeRemaining.Milliseconds.ToString().PadLeft(2, '0')));
            return totalTimeinMillSec;
        }
    
        private static int GetTotoalTimeinMilliSecond(int firstLoopCount, int secondLoopCount, int thirdLoopCount, int fourthLoopCount, int firstLoopSleepTime, int secondLoopSleepTime, int thirdLoopSleepTime, int fourthLoopSleepTime)
        {
            var totalTime = (firstLoopCount * firstLoopSleepTime +
                                      firstLoopCount * secondLoopCount * secondLoopSleepTime +
                                      firstLoopCount * secondLoopCount * thirdLoopCount * thirdLoopSleepTime +
                                      firstLoopCount * secondLoopCount * thirdLoopCount * fourthLoopCount * fourthLoopSleepTime);
            
            return totalTime;
        }
    
    }
    
    
    }
    
    类程序
    {
    静态void Main(字符串[]参数)
    {
    DateTime startTime=DateTime.Now;
    var random=新的random();
    Console.Clear();
    //模拟启动延迟
    //控制台写入线(“启动”);
    Sleep(random.Next(1001000));
    int firstLoopCount=random.Next(1,10);
    int secondLoopCount=random.Next(1,10);
    int thirdLoopCount=random.Next(1,10);
    int-fourthLoopCount=random.Next(1,10);
    int firstLoopSleepTime=random.Next(1001000);
    int secondLoopSleepTime=random.Next(1001000);
    int thirdLoopSleepTime=random.Next(1001000);
    int-fourthLoopSleepTime=random.Next(1001000);
    //**************添加了1,因为循环从0开始,以不同的循环计数结束,包括循环本身。
    var totalTimeinMillSec=GetToAltimeinMillSecond(firstLoopCount+1,secondLoopCount+1,thirdLoopCount+1,fourthLoopCount+1,firstLoopSleepTime,secondLoopSleepTime,thirdLoopSleepTime,fourthLoopSleepTime);
    打印和获取剩余时间(以毫秒为单位的总时间);
    
    对于(int-loop1=0;loop1,我认为这可能适合您;为了完成解决方案,我创建了几个类来提供帮助

    代码本身有一些注释

    首先是一个枚举,以了解我们在哪个循环中;这并不是完全必要的,但它可能值得以后进行重构

    public enum LoopEnum
    {
        loop1,
        loop2,
        loop3,
        loop4
    }
    
    然后我创建了一个名为
    EtaLoop
    的类,该类将包含整个循环信息/逻辑,为了知道循环的单个迭代需要多长时间,我使用
    秒表

    public class EtaLoop
    {
        public readonly int TotalIterations;
        private readonly List<long> _loopsTimesInMiliseconds;
        private readonly Stopwatch _stopwatch;
    
        public EtaLoop(int totalIterations)
        {
            //+1 as the loops starts on 0
            TotalIterations = totalIterations+1;
            _loopsTimesInMiliseconds = new List<long>();
            _stopwatch = new Stopwatch();
    
        }
        public double AvgExecution()
        {
            return _loopsTimesInMiliseconds.Any() ? _loopsTimesInMiliseconds.Average(a => a) : 0;
        }
    
        public void Start()
        {
            if(!_stopwatch.IsRunning)
                _stopwatch.Start();
        }
    
        public void Stop()
        {
            _stopwatch.Stop();
            _loopsTimesInMiliseconds.Add(_stopwatch.ElapsedMilliseconds);
            ResetStopWatch();
        }
        public int CurrentIteration()
        {
            return _loopsTimesInMiliseconds.Count();
        }
    
        public long EstimatedCurrentIteration()
        {
            return Convert.ToInt64(_loopsTimesInMiliseconds.Average(a => a) * TotalIterations);
        }
    
        private void ResetStopWatch()
        {
            _stopwatch.Reset();
        }
    }
    
    最后是
    etatimeheloper
    的包装,它将包含所有
    EtaTimes
    ;最初我想做一个列表,这就是
    enum
    的原因,但是,我认为这样更清楚。 注意:此类可以拆分/移动到扩展方法

    这里的要点是
    RegisterLoop
    每次我们完成一个循环时,我们都必须调用该方法;它必须在这里,因为我需要来自其他循环的信息

    public class EtaTimeHelper
    {
        //This part can be done in a list, but i think it is easier to see like this.
        public readonly EtaTime Loop1;
        public readonly EtaTime Loop2;
        public readonly EtaTime Loop3;
        public readonly EtaTime Loop4;
        public readonly DateTime StartTime;
        private DateTime _lastPrintTime;
        private const int TimeBetweenPrintsInSeconds = 10;
    
    
        public EtaTimeHelper()
        {
            Loop1 = new EtaTime(LoopEnum.loop1);
            Loop2 = new EtaTime(LoopEnum.loop2);
            Loop3 = new EtaTime(LoopEnum.loop3);
            Loop4 = new EtaTime(LoopEnum.loop4);
            StartTime = DateTime.Now;
            _lastPrintTime = DateTime.MinValue;
        }
    
        public void RegisterLoop(LoopEnum loopNumber)
        {
    
            switch (loopNumber)
            {
                case LoopEnum.loop1:
                    Loop1.RegisterLoop();
                    break;
                case LoopEnum.loop2:
                    Loop2.RegisterLoop();
                    break;
                case LoopEnum.loop3:
                    Loop3.RegisterLoop();
                    break;
                case LoopEnum.loop4:
                    Loop4.RegisterLoop();
                    break;
                default:
                    throw new NotImplementedException("please register the loop");
    
            }
    
            PrintCompletionTime(DateTime.Now, loopNumber);
        }
    
    
        public void PrintCompletionTime(DateTime printTime, LoopEnum loopNumber)
        {
            if(_lastPrintTime.AddSeconds(TimeBetweenPrintsInSeconds) < printTime)
            {
                var time = CalculatePredictionTime(loopNumber);
                Print(time);
                _lastPrintTime = printTime;
            }
        }
    
        private long CalculatePredictionTime(LoopEnum loopNumber)
        {
            switch (loopNumber)
            {
                case LoopEnum.loop1: 
                    return LoopPrediction(Loop1.GetAvgTimeAndAvgExTimes());
                case LoopEnum.loop2:
                    return Loop2Prediction(Loop1, Loop2);
                case LoopEnum.loop3:
                    return Loop3Prediction(Loop1, Loop2, Loop3);
                case LoopEnum.loop4:
                    return Loop4Prediction(Loop1, Loop2, Loop3, Loop4);
                default:
                    throw new NotImplementedException("please register the loop");
    
            }
    
    
            //If all loops in #1 are finished, all sub loops are also finished. which means, it is the "end of the loop"
            long LoopPrediction((double, double) avgTimeAndAvgExTimes)
            {
                double avgTimePerLoop = avgTimeAndAvgExTimes.Item1;
                double avgIterations = avgTimeAndAvgExTimes.Item2;
                return Convert.ToInt64(avgTimePerLoop * avgIterations);
            }
    
            long Loop2Prediction(EtaTime loop1, EtaTime loop2)
            {
                
                var loop1Prediction = LoopPrediction(loop1.GetAvgTimeAndAvgExTimes());
    
                var loop2Values = loop2.GetAvgTimeAndAvgExTimes();
                long avgPerLoop = LoopPrediction(loop2Values);
    
                var loop1AvgIterations = loop1.GetAvgTimeAndAvgExTimes().Item2;
                var expectedLoop2Iterations = loop1AvgIterations;
    
                double loop2Predictions = avgPerLoop * expectedLoop2Iterations;
    
                if (loop1Prediction == 0)
                {
                    return Convert.ToInt64(loop2Predictions);
                }
                else
                {
                    //1+current iteration
                    return loop1Prediction + loop2.GetCurrentIteration();
                }
            }
    
            long Loop3Prediction(EtaTime loop1, EtaTime loop2, EtaTime loop3)
            {
                var loop1_2Prediction = Loop2Prediction(loop1, loop2);
    
                var loop3Values = loop3.GetAvgTimeAndAvgExTimes();
                long avgPerLoop = LoopPrediction(loop3Values);
    
                var loop2AvgIterations = loop2.GetAvgTimeAndAvgExTimes().Item2;
                var loop1AvgIterations = loop1.GetAvgTimeAndAvgExTimes().Item2;
                var expectedLoop3Iterations = loop2AvgIterations * loop1AvgIterations;
    
                double loop3Predictions = avgPerLoop * expectedLoop3Iterations;
    
                if (loop1_2Prediction == 0)
                {
                    return Convert.ToInt64(loop3Predictions);
                }
                else
                {
                    //1-2+current iteration
                    return loop1_2Prediction+ loop3.GetCurrentIteration();
                }
            }
    
            long Loop4Prediction(EtaTime loop1, EtaTime loop2, EtaTime loop3, EtaTime loop4)
            {
                var loop1_2_3Prediction = Loop3Prediction(loop1, loop2, loop3);
    
                var loop4Values = loop4.GetAvgTimeAndAvgExTimes();
                long avgPerLoop = LoopPrediction(loop4Values);
    
                var loop2AvgIterations = loop2.GetAvgTimeAndAvgExTimes().Item2;
                var loop1AvgIterations = loop1.GetAvgTimeAndAvgExTimes().Item2;
                var loop3AvgIterations = loop3.GetAvgTimeAndAvgExTimes().Item2;
                var expectedLoop4Iterations = loop2AvgIterations * loop1AvgIterations* loop3AvgIterations;
    
                double loop4Predictions = avgPerLoop * expectedLoop4Iterations;
    
                if (loop1_2_3Prediction == 0)
                {
                    return Convert.ToInt64(loop4Predictions);
                }
                else
                {
                    //1-2-3+current iteration
                    return loop1_2_3Prediction + loop4.GetCurrentIteration();
                }
            }
        }
    
        private void Print(long ms)
        {
            DateTime estimatedCompletionTime = StartTime.AddMilliseconds(ms);
    
            TimeSpan leftTime = (estimatedCompletionTime - DateTime.Now);
    
            Console.WriteLine("ETA: ");
            Console.WriteLine($"{leftTime.Days} Days, {leftTime.Hours} Hours, {leftTime.Minutes} Minutes, {leftTime.Seconds} Seconds");//, leftTime.Days.ToString().PadLeft(3, '0'), leftTime.Hours.ToString().PadLeft(2, '0'), leftTime.Minutes.ToString().PadLeft(2, '0'), leftTime.Seconds.ToString().PadLeft(2, '0')));
            Console.WriteLine($"on {estimatedCompletionTime.ToString("yyyy/MM/dd HH:mm:ss")}");
            Console.WriteLine($"Current Time: {DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")}");
        }
    
    }
    
    这是一把“工作”小提琴
    注意:它在几秒钟后超时,在您的本地机器中工作正常。

    为了每秒断言ETA,我所做的是将事件附加到
    System.Timers.Timer
    对象。该事件将每秒触发,以便持续向用户提供ETA反馈

                System.Timers.Timer aTimer = new System.Timers.Timer(1000);
                aTimer.Elapsed += (sender, e) => ATimer_Elapsed(sender, e, new MyEventArguments
                {
                    Loop1TotalIterations = intCount,
                    CurrentIndex = loop1,
                    Start = startTime
    
                });
                aTimer.AutoReset = true;
                aTimer.Enabled = true;
    
    在您的示例中,我们使用
    线程.Sleep
    来模拟延迟

    使用
    Thread.Sleep
    将使一切进入睡眠状态,因此时间逻辑将不准确

    我所做的是创建一个多线程应用程序,以便在一个线程上运行逻辑,在另一个线程上运行时间。因此,当我们暂停时间检查时,ETA将继续运行

    综上所述,我们有以下几点:

    namespace ConsoleApp10
    {
        #region Usings
    
        using System;
        using System.Threading;
        using System.Threading.Tasks;
        using System.Timers;
    
        #endregion
    
        /// <summary>
        /// Event class to be passed to ElapsedEventHandler
        /// </summary>
        public class MyEventArguments
        {
            public int Loop1TotalIterations { get; set; }
    
            public DateTime Start { get; set; }
    
            public DateTime CurrentDate => DateTime.Now;
    
            public int CurrentIndex { get; set; }
        }
    
        class Program
        {
            /// <summary>
            ///  Compute the remaining time
            /// </summary>
            public static void ComputeRemaining((int count, DateTime time) start, (int count, DateTime time) current, int end)
            {
                var T = current.count - start.count == 0
                    ? TimeSpan.MaxValue
                    : TimeSpan.FromSeconds((end - current.count) * current.time.Subtract(start.time).TotalSeconds / (current.count - start.count));
    
                Console.Clear();
                Console.SetCursorPosition(0, 0);
                Console.ForegroundColor = (ConsoleColor)15;
                Console.WriteLine(String.Format("ETA: {0} Days, {1} Hours, {2} Minutes, {3} Seconds",
                    T.Days.ToString().PadLeft(3, '0'),
                    T.Hours.ToString().PadLeft(2, '0'),
                    T.Minutes.ToString().PadLeft(2, '0'),
                    T.Seconds.ToString().PadLeft(2, '0')));
    
                Console.WriteLine();
            }
            
            static void Main(string[] args)
            {
                DateTime startTime = DateTime.Now;
                Random random = new Random();
                int intCount = random.Next(1, 10);
                int loop1 = 0;
    
                var time = Task.Factory.StartNew(() =>
                {
                    System.Timers.Timer aTimer = new System.Timers.Timer(1000);
                    aTimer.Elapsed += (sender, e) => ATimer_Elapsed(sender, e, new MyEventArguments
                    {
                        Loop1TotalIterations = intCount,
                        CurrentIndex = loop1,
                        Start = startTime
    
                    });
                    aTimer.AutoReset = true;
                    aTimer.Enabled = true;
    
                });
    
                var logic = Task.Factory.StartNew(() =>
                {
                    PrintAndSimulate("Initiate");
    
                    for (loop1 = 0; loop1 <= intCount; loop1++)
                    {
                        PrintAndSimulate("\tloop1");
    
                        for (int loop2 = 0; loop2 <= random.Next(1, 10); loop2++)
                        {
                            PrintAndSimulate("\t\tloop2");
    
                            for (int loop3 = 0; loop3 <= random.Next(1, 10); loop3++)
                            {
                                PrintAndSimulate("\t\t\tloop3");
    
                                for (int loop4 = 0; loop4 <= random.Next(1, 10); loop4++)
                                {
                                    PrintAndSimulate("\t\t\t\tloop4");
                                }
                            }
                        }
                    }
                });
    
                Task.WaitAll(new[] { time, logic });
            }
    
            /// <summary>
            ///  Display the info string and simulates a delay
            /// </summary>
            private static void PrintAndSimulate(string info)
            {
                int time = new Random().Next(100, 1000);
                Console.SetCursorPosition(5, 5);
                Console.ForegroundColor = (ConsoleColor)new Random().Next(15);
                Console.WriteLine(info);
                Thread.Sleep(time);
            }
    
            /// <summary>
            /// ElapsedEventHandler
            /// </summary>
            private static void ATimer_Elapsed(object sender, ElapsedEventArgs e, MyEventArguments myEventArguments)
            {
                ComputeRemaining((0, myEventArguments.Start), (myEventArguments.CurrentIndex, myEventArguments.CurrentDate), myEventArguments.Loop1TotalIterations);
            }
        }
    }
    
    名称空间控制台App10
    {
    #区域使用
    使用制度;
    使用系统线程;
    使用System.Threading.Tasks;
    使用系统计时器;
    #端区
    /// 
    ///要传递给ElapsedEventHandler的事件类
    /// 
    公共类MyEventArguments
    {
    公共int-loop1totalitions{get;set;}
    公共日期时间开始{get;set;}
    public DateTime CurrentDate=>DateTime.Now;
    public int CurrentIndex{get;set;}
    }
    班级计划
    {
    /// 
    ///计算剩余时间
    /// 
    公共静态无效计算机维护((整数计数,日期时间)开始,(整数c