我最近一直在研究一些多线程控制台应用程序,并且想知道如何做到这一点。我使用此代码来控制应用程序创建的线程数量:
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循环中的反转条件。
答案 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飙升。