【发布时间】:2012-06-19 21:32:15
【问题描述】:
我正在研究一些简单的线程应用程序,但我似乎无法让它工作:
class ThreadTest
{
static Queue<Thread> threadQueue = new Queue<Thread>();
static void Main()
{
//Create and enqueue threads
for (int x = 0; x < 2; x++)
{
threadQueue.Enqueue(new Thread(() => WriteNumber(x)));
}
while(threadQueue.Count != 0)
{
Thread temp = threadQueue.Dequeue();
temp.Start();
}
Console.Read();
}
static void WriteNumber(int number)
{
for (int i = 0; i < 1000; i++)
{
Console.Write(number);
}
}
}
目标基本上是把线程一个一个地添加到队列中,然后一个个地穿过队列,弹出一个线程并执行它。因为我的 for 循环中有“x
我最终得到的是 2000 个 2。我想出的两个可能的解决方案是:我错过了一些非常明显的事情,或者将变量 x 发送到 WriteNumber 函数正在执行传递引用而不是传递值,所以当线程执行他们使用最新版本的 x 而不是设置函数时的版本。但是,据我了解,变量在 C# 中默认按值传递,并且只有在参数中包含 'ref' 时才通过引用传递。
【问题讨论】:
-
线程队列肯定是一个不寻常的想法。
-
这不是一个奇怪的想法,这就是线程池在内部所做的。所以使用线程池。
-
线程池通常有一个任务类实例的队列,如果它们可以跟踪跟踪,则有一个固定的线程列表,可以使任务出列并执行任务。列表/队列中的微观管理线程通常会导致灾难。我已经在 SO 上看到了一些尝试——大量代码试图轮询列表中的线程是否“完成”,释放它们并创建新的线程来填充数组中的漏洞。真可怕……
标签: c# multithreading