【问题标题】:Show program runtime every 3 seconds每 3 秒显示一次程序运行时间
【发布时间】:2021-05-10 15:51:47
【问题描述】:

我正在学习 C# 中的异步,并希望每三秒显示一次程序运行时。我有两个解决方案,但都不能完全正常工作。

解决方案 1

在第一个解决方案中,我有一个循环调用两个方法。第一个执行计算,第二个显示启动时间,可以被 3 整除。

namespace Async
{
    class Program
    {
        static void Main(string[] args)
        {
            PerformLoop();

            Console.ReadLine();
        }

        public static async void PerformLoop()
        {
            Stopwatch timer = new Stopwatch();
            timer.Start();
            List<Task> l = new List<Task>();
            for (int i = 0; i < 50; i++)
            {
                l.Add(AsyncCalculation(i));
                l.Add(ShowTime(Convert.ToInt32(timer.Elapsed.TotalMilliseconds)));
            }
            await Task.WhenAll(l);
            timer.Stop();

            Console.WriteLine("Total execution time: " +
                timer.Elapsed.TotalMilliseconds);
        }

        public async static Task AsyncCalculation(int i)
        {
            var result = 10 * i;
            Console.WriteLine("Calculation result: " + result);
        }

        public async static Task ShowTime(int execTime)
        {
            if (execTime % 3 == 0)
            {
                Console.WriteLine("Execution time: " + execTime);
            }
        }
    }
}

解决方案 2

在第二个解决方案中,我在一个循环中调用了两个方法。第一个执行计算,第二个显示 3 秒后的操作时间。不幸的是,在这种情况下,第二种方法阻止了第一种方法的执行。

namespace Async
{
    class Program
    {
        static void Main(string[] args)
        {
            CallMethod();

            Console.ReadLine();
        }

        public static async void CallMethod()
        {
            for (int i = 0; i < 50; i++)
            {
                var results = Calculation(i);
                var calcResult = results.Item1;
                var time = results.Item2;

                ShowResult(calcResult);
                await ShowDelayTime(time);
            }
        }

        public static void ShowResult(int calcResult)
        {
            Console.WriteLine("Calculation result: " + calcResult);
        }

        public async static Task ShowDelayTime(int execTime)
        {
            await Task.Delay(3000);
            Console.WriteLine("Execution time: " + execTime);
        }

        public static Tuple<int, int> Calculation(int i)
        {
            Stopwatch stopwatch = new Stopwatch();

            stopwatch.Start();

            var result = 10 * i;

            stopwatch.Stop();

            return Tuple.Create(result,
                Convert.ToInt32(stopwatch.Elapsed.TotalMilliseconds));
        }
    }
}

我不知道如何连续显示计算结果并以三秒显示程序的运行时间:(((

编辑

预期输出(示例):

Calculation result: 0
Calculation result: 10
Execution time: 3 seconds
Calculation result: 20
Calculation result: 30
Calculation result: 40
Execution time: 6 seconds
Calcultion result: 50
//Next iterations

程序现在显示结果,等待三秒钟,然后进入下一次迭代。我希望计算的迭代无论(独立)时间都显示出来。我希望每三秒显示一次程序运行的时间。

【问题讨论】:

  • 作为旁注,avoid async void。查找 Main 入口点的异步版本。
  • 你的预期输出是什么?
  • @insane_developer 我正要问同样的事情!
  • 第一个 sn-p:你那里没有任务,Task.WhenAll() 不保证特定的顺序。第二个可以工作,让你的方法只是voidTask.Run()你的ShowDelayTime(time),传递一个CancellationToken,当计算终止时取消任务。 -- 您不需要秒表(除非您需要精确;在这种情况下,将其初始化为ShowDelayTime())并且Calculation() 应该返回int。 -- 作为一个练习。
  • @TheodorZoulias @insane_developer 我想要这样的东西:Calculation result: 0 Calculation result: 10 Execution time: 3 seconds Calculation result: 20 Calculation result: 30 Calculation result: 40 Execution time: 6 seconds Calculation result: 50 我想要每三秒显示一次结果和独立显示的时间。

标签: c# asynchronous async-await stopwatch


【解决方案1】:

您可以使用System.Threading.Timer 每 3 秒调用一次回调,使用Stopwatch 来测量自程序启动以来经过的秒数:

var stopwatch = Stopwatch.StartNew();
var timer = new System.Threading.Timer(_ =>
{
    Console.WriteLine($"Execution time: {stopwatch.Elapsed.TotalSeconds:#,0} seconds");
}, null, 3000, 3000);

【讨论】:

  • 只需确保将timer 的引用存储在某个静态变量中,否则它可能会被垃圾收集器回收(并因此停止滴答)。
猜你喜欢
  • 2020-08-28
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多