while循环没有阻塞控制台输出

时间:2015-04-27 21:15:52

标签: c# multithreading

我最近一直在研究一些多线程控制台应用程序,并且想知道如何做到这一点。我使用此代码来控制应用程序创建的线程数量:

foreach(string s in File.ReadAllLines("file.txt")){
    while (threads >= maxThreads) ;
    Thread t = new Thread(() => { 
        threads++;
        //thread code - make network request using 's'
        Console.WriteLine("TEST");
        threads--;
        Thread.CurrentThread.Abort();
    });
    t.start();
}

但是,由于while循环,创建中的Console.WriteLine方法被阻止,并且在下一个空闲线程可用之前不会显示。

有什么方法可以防止这种阻止Console.WriteLine来电的循环吗?

编辑 - while循环中的反转条件。

2 个答案:

答案 0 :(得分:6)

<强>更新

根据您的评论...

该行

while (threads >= maxThreads) ;

不是等待线程状态更改的好方法,因为它会导致CPU在while语句中旋转。相反,请使用一种用于线程同步的机制,例如Semaphore

这是用于非常类似情况的SemaphoreSlim的an example

class TheClub      // No door lists!
{
  static SemaphoreSlim _sem = new SemaphoreSlim (3);    // Capacity of 3

  static void Main()
  {
    for (int i = 1; i <= 5; i++) new Thread (Enter).Start (i);
  }

  static void Enter (object id)
  {
    Console.WriteLine (id + " wants to enter");
    _sem.Wait();
    Console.WriteLine (id + " is in!");           // Only three threads
    Thread.Sleep (1000 * (int) id);               // can be here at
    Console.WriteLine (id + " is leaving");       // a time.
    _sem.Release();
  }
}

答案 1 :(得分:4)

使用while循环和thread.abort(或thread.suspned)等是CPU密集型的,并不是线程同步的正确方法。探索Manual和AutoResetEvents。它们在线程同步方面非常有效,并且不会使CPU飙升。