代码之家  ›  专栏  ›  技术社区  ›  Mr. Smith

C#-ThreadPool.QueueUserWorkItem()要求

  •  0
  • Mr. Smith  · 技术社区  · 14 年前

    我有一个windows服务,有很多工作要同时做。我研究了线程并找到了ThreadPool类。我现在被卡住了,似乎没有任何效果,就像我排队的东西从来没有运行或调用过一样。在服务的OnStart()事件中,我创建了如下线程:

    Thread mainThread = new Thread(ReceiveMessages);
    mainThread.Start();
    

    在ReceiveMessages()方法中,我有一个例程,它检查消息队列,然后遍历消息。对于每个迭代,我调用以下代码来处理每条消息:

    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
    {
        Interpreter.InsertMessage(encoding.GetBytes(MessageBody));
    }), null);
    

    我认为语法是正确的,它编译没有问题,但我不能不觉得我遗漏了一些东西。当我运行服务时,什么也没发生。但是,如果我将上述代码段替换为:

    insertThread = new Thread(delegate() { Interpreter.InsertMessage(encoding.GetBytes(MessageBody)); });
    insertThread .Start();
    

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jeff Sternal    14 年前

    看起来你在创造 a closure 结束 MessageBody 来电者 消息正文 InsertMessage

    Interpreter.InsertMessage 接受对象并使用 那个 作为你的 WaitCallback

    public void InsertMessage(object messageBody) {
        this.InsertMessage((byte[])messageBody);
    }
    

    然后将消息正文字节作为第二个参数传递:

    ThreadPool.QueueUserWorkItem(new WaitCallback(Interpreter.InsertMessage), 
                                 encoding.GetBytes(MessageBody));
    
        2
  •  1
  •   Reed Copsey    14 年前

    Foreground thread . 但是,线程池线程具有 IsBackground

    这意味着线程池线程将无法使应用程序保持活动状态。这可能就是它从不“运行”的原因——它只是马上关闭。

    但它的效率不是很高,可能会导致服务崩溃(这是偶尔发生的,这就是为什么我尝试改用adpool的原因)。有人能解释一下这个问题吗?