【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%。 支持一下,学习了,很不错的思路 勇哥涉猎甚广啊! 有点意思,学习了 本帖最后由 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]