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

打印控制台应用程序c中独立线程的当前状态#

  •  -1
  • User987  · 技术社区  · 8 年前

    Parallel.Foreach(items,dbItem=>
    {
      int counter = 0; 
      Interlocked.Increment(ref counter);
      Console.WriteLine("Current counter state: " + counter);
    });
    

    Thread {0} - Current conter state: 1 << Value 1 gets re-printed every time this console.writeline occurs... ? 
    Thread {1} - Current conter state: 1
    Thread {2} - Current conter state: 1
    Thread {3} - Current conter state: 1
    Thread {4} - Current conter state: 1
    Thread {5} - Current conter state: 1
    

    这可行吗?如果可行,怎么办?

       Thread {1} - Current conter state: >>2<< this value here gets updated
    

    无需在控制台中执行类似操作:

       Thread {1} - Current conter state: 1
       Thread {1} - Current conter state: 2
       Thread {1} - Current conter state: 3
       Thread {1} - Current conter state: 4
       Thread {1} - Current conter state: 5
    

    我只想在控制台应用程序中重新打印计数器值。。。

    1 回复  |  直到 8 年前
        1
  •  0
  •   Aleks Andreev Md. Suman Kabir    8 年前

    所以您需要在控制台中更新一个值?尝试以下代码(这只是一个演示):

    var counters = new ConcurrentDictionary<string, int>();
    
    var threads = Enumerable.Range(0, 5).Select(i => new Thread(() =>
    {
        var key = $"Thread {i}";
        for (var j = 0; j < 10; ++j)
        {
            var counter = j;
            counters.AddOrUpdate(key, counter, (k, v) => counter);
            Thread.Sleep(200);
        }
    })).ToList();
    threads.ForEach(t => t.Start());
    
    while (threads.Any(t => t.IsAlive))
    {
        int line = 0;
        foreach (var counter in counters)
        {
            Console.SetCursorPosition(1, line++);
            Console.WriteLine($"{counter.Key} - {counter.Value}");
            Thread.Sleep(50);
        }
    }