MSDN说BlockingCollection.Take调用块,如果没有元素。这是否意味着该线程将产生时间片并进入等待线程队列?
如果是,是否意味着一旦阻塞集合收到一个项目,线程将其状态更改为Ready,然后将按照通常的规则安排到下一个时间片?
答案 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);
}
}
}