wincao 发表于 2024-3-1 09:43

【C#】以执行频率打印进度,即文字进度条

难点在最后输出100%问题。
经过多次实践,终于找出解决:
      /// <summary>
      /// 以执行频率打印进度
      /// </summary>
      /// <param name="Max">最大值</param>
      /// <param name="Y">执行频率</param>
      public static void Do(Action work, double Max, double Y = 0.01)
      {
            int current = 0;
            for (int i = 0; i < Max; i++)
            {
                //百分之一时反馈
                if ((int)(current++ % (Max * Y)) == 0)
                  Console.WriteLine($"已经完成{current}个,进度{Math.Floor(current / (Max * 0.01))}%。");
                //工作代码
                work();
            }
            //补充100%的输出
            if ((int)((current - 1) % (Max * Y)) != 0)
            {
                Console.WriteLine($"已经完成{current}个,进度{Math.Floor(current / (Max * 0.01))}%。");
            }
      }

      public static void work()
      {
            //工作代码
            Thread.Sleep(100);
      }

执行代码:
            //以执行频率打印进度
            Class6.Do(Class6.work, 99, 0.3);

最后显示结果:
已经完成1个,进度1%。
已经完成31个,进度31%。
已经完成61个,进度61%。
已经完成91个,进度91%。
已经完成99个,进度100%。

jstar 发表于 2024-3-1 10:12

支持一下,学习了,很不错的思路

cc007 发表于 2024-3-1 11:05

勇哥涉猎甚广啊!

Reo_52 发表于 2024-3-1 12:46

有点意思,学习了

wincao 发表于 2024-3-15 09:39

本帖最后由 wincao 于 2024-3-15 09:49 编辑

改进计算方法:
    public static event DG反馈<int> E进度;

    /// <summary>
    /// 重复执行进程
    /// </summary>
    /// <param name="Max">最大值</param>
    /// <param name="Y">执行频率</param>
    public static void Do(Action work, double Max, double Y = 0.01)
    {
      for (int i = 0; i < Max; i++)
      {
            if (i == Max - 1) { E进度(100); }//补充100%的输出
            else if ((int)(i % (Max * Y)) == 0)//百分之一时反馈
                E进度((int)(Math.Floor(i / (Max * 0.01))));
            //工作代码
            work();
      }

      E进度?.Invoke(0);//结束
    }



循环在工作代码时:
    /// <summary>
    /// 进度计算
    /// </summary>
    /// <param name="current">当前进度</param>
    /// <param name="Max">最大进度</param>
    /// <param name="Y">执行频率</param>
    public static void Do(int current, double Max = 100, double Y = 0.01)
    {
      //补充100%的输出
      if (current == Max) { E进度?.Invoke(100); }
      //百分之一时反馈
      else if ((int)(current % (Max * Y)) == 0)
            E进度?.Invoke((int)(Math.Floor(current / (Max * 0.01))));
    }
工作代码:
    public void work()
    {
      //工作内部进度的调用方法
      int current = 0;
      double Max = 100;
      for (int i = 0; i < Max; i++){
      Thread.Sleep(100);//工作代码
      ClassProgressBar.Do(++current, Max);}
    }
页: [1]
查看完整版本: 【C#】以执行频率打印进度,即文字进度条