WaitCallback和QueueUserWorkItem

时间:2009-09-24 12:39:34

标签: c# delegates call

当我实施

WaitCallback waitCB = new WaitCallback(DisplayTime);
for (int i = 1; i <= 5; i++)
{
  ThreadPool.QueueUserWorkItem(waitCB, null);
  Thread.Sleep(2000);
}


    public void DisplayTime(object state)
    {
        Console.WriteLine("Current Time {0} ", DateTime.Now);
    }

(1)这是不是意味着,我的工作是排队到CLR?

(2)CLR在完成队列中现有的待处理项目后会处理吗?

(3)在队列中处理我的项目的时间是不可预测的?

2 个答案:

答案 0 :(得分:3)

  

(1)这是不是意味着,我的工作是排队到CLR?

一旦来自池中的线程可用,它就排队等待处理

  

(2)CLR在完成队列中现有的待处理项目后会处理吗?

可以同时执行多个作业...只要其中一个池线程可用,就会用它来处理队列中的下一个项目

  

(3)在队列中处理我的项目的时间是不可预测的?

不,至少不容易......您必须知道排队的作业需要多长时间才能执行,并跟踪每个作业以计算给定作业的执行时间。你为什么还想知道呢?

答案 1 :(得分:2)

您的回调将基于CLR用于分配和启动其池中的线程的任何算法在线程池线程上执行。

在您的示例中,回调将立即以一种看似确定的方式处理。但是,根据线程池的状态,这很容易改变。如果你的进程耗尽了池中的所有线程,那么在其他地方的线程完成并可用之前,你的回调就不会被执行。