【问题标题】:WaitCallback and QueueUserWorkItemWaitCallback 和 QueueUserWorkItem
【发布时间】:2009-09-24 12:39:33
【问题描述】:

当我实施时

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 ) 处理队列中我的项目的时间是否不可预测?

【问题讨论】:

    标签: c# delegates call


    【解决方案1】:

    ( 1 ) 这是否意味着,我的工作已排入 CLR 队列?

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

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

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

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

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

    【讨论】:

    • 我对(3)的疑问是,CLR 处理我的项目的时间是不可预测的;CLR 对我的项目的服务是不确定的吗?
    • 不,这不是确定性的。 CLR 无法知道下一个池线程何时可用
    【解决方案2】:

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

    在您的示例中,回调将立即以看似确定的方式处理。但是,这很容易根据线程池的状态而改变。如果您的进程已用完池中的所有线程,那么您的回调将不会被执行,直到其他地方的线程完成并可供它使用。

    【讨论】:

      猜你喜欢
      • 2017-10-16
      • 2012-10-10
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-10
      相关资源
      最近更新 更多