BlockingCollection类:如果Take块,线程是否会产生?

时间:2010-06-18 23:55:43

标签: c# multithreading .net-4.0

MSDN说BlockingCollection.Take调用块,如果没有元素。这是否意味着该线程将产生时间片并进入等待线程队列?

如果是,是否意味着一旦阻塞集合收到一个项目,线程将其状态更改为Ready,然后将按照通常的规则安排到下一个时间片?

2 个答案:

答案 0 :(得分:3)

是。当您在Take()上调用BlockingCollection<T>时,线程将被阻塞(等待事件句柄),直到元素从另一个线程添加到集合中。这将导致该线程放弃其时间片。

当一个元素被添加到集合中时,线程将被发出信号以继续,获取元素并继续。

答案 1 :(得分:0)

我认为这可能会让更多读者感兴趣。这就是我建立这个事实的方式。

class Program
{
    static BlockingCollection<int> queue = new BlockingCollection<int>();
    static Thread th = new Thread(ThreadMethod);
    static Thread th1 = new Thread(CheckMethod);

    static void Main(string[] args)
    {
        th.Start();
        th1.Start();

        for (int i = 0; i < 100; i++)
        {
            queue.Add(i);
            Thread.Sleep(100);
        }

        th.Join();

        Console.ReadLine();
    }

    static void ThreadMethod()
    {
        while (!queue.IsCompleted)
        {
            int r = queue.Take();
            Console.WriteLine(r);
        }
    }

    static void CheckMethod()
    {
        while (!queue.IsCompleted)
        {
            Console.WriteLine(th.ThreadState);
            Thread.Sleep(48);
        }
    }
}