代码之家  ›  专栏  ›  技术社区  ›  TyForHelpDude

在循环中更新文本的某些值

  •  1
  • TyForHelpDude  · 技术社区  · 6 年前

    我只想在控制台应用程序中看到更新的数字,以下是我尝试实现的方法:

    int successEntryCount = 0;
    int failedEntryCount = 0;
    
    Console.WriteLine("App Started:");
    
    foreach (var entity in entities)
    {
        var res = bll.AsiErtelemeIptalPaketiGonder(entity);
        if (res.State == Framework.Entities.MessageResultState.SUCCESS)
            successEntryCount++;
        else
            failedEntryCount++;
    
        Console.WriteLine("success :{0}", successEntryCount);
        Console.WriteLine("fail:{0}", failedEntryCount);
    }
    

    当然它复制了这条线 Console.Clear() 不是一个好的选择,因为文本将闪烁太快。我只想看到这些数字更新。

    3 回复  |  直到 6 年前
        1
  •  3
  •   SᴇM    6 年前

    使用 Console.SetCursorPosition 方法。让我们来看一个简单的例子:

    int successEntryCount = 0,
        failedEntryCount = 10,
        l = Console.CursorLeft,
        t = Console.CursorTop;
    
    for (int i = 0; i < 2000; i++)
    {
        Thread.Sleep(100);
        Console.SetCursorPosition(l, t);
    
        Console.WriteLine("success :{0}", successEntryCount++);
        Console.WriteLine("fail:{0}", failedEntryCount++);
        //or
        //Console.Write("success :{0} fail:{1}", successEntryCount++ , failedEntryCount++);
    }
    

    它将在不闪烁的情况下更新/打印值。

    有更多的选择(如果你觉得它们对你更有吸引力)来实现同样的目标,例如:

    Console.Write("\rsuccess :{0} fail:{1}", successEntryCount++, failedEntryCount++); //Carriage return
    

    \r 表示回车符(字符13),表示光标返回到行的开头。

    Console.Write("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bsuccess :{0} fail:{1}", successEntryCount++ , failedEntryCount++); //Using backspaces
    

    \b 是退格字符(字符8)。

    参考文献: MSDN Escape Sequences

        2
  •  1
  •   user1672994    6 年前

    你可以使用 Console.SetCursorPosition 设置光标位置。另外,为了不丢失现有的控制台日志(已经像-app started一样记录:在您的情况下),您可以根据检索到的左上位置设置光标位置。可以使用 Console.CursorLeft Console.CursorTop 性质。

    int successEntryCount = 0;
    int failedEntryCount = 0;
    
    Console.WriteLine("App Started:");
    
    int left = Console.CursorLeft;
    int right = Console.CursorTop;
    
    foreach (var entity in entities)
    {
        var res = bll.AsiErtelemeIptalPaketiGonder(entity);
        if (res.State == Framework.Entities.MessageResultState.SUCCESS)
            successEntryCount++;
        else
            failedEntryCount++;
    
        Console.SetCursorPosition(left, right);
        Console.WriteLine("success :{0}", successEntryCount);
        Console.WriteLine("fail:{0}", failedEntryCount);
    }
    
        3
  •  0
  •   500 - Internal Server Error    6 年前

    而不是

    Console.WriteLine("success :{0}", successEntryCount);
    Console.WriteLine("fail:{0}", failedEntryCount);
    

    你可以试试

    Console.Write("success :{0} fail:{1}            \r", successEntryCount, failedEntryCount);