ThreadPool.QueueUserWorkItem导致应用程序挂起直到完成

时间:2010-12-10 00:28:53

标签: c# asp.net multithreading threadpool

这可能是由于缺乏对幕后发生的事情的理解,或者仅仅是因为对一般的线程缺乏了解。当用户登录时,我需要运行一些调用Web服务来更新系统中数据的任务。由于服务可能需要相当长的时间,因此我会对整个过程进行操作。但是,即使我认为我在与我的应用程序分开的一个线程中运行了整个系列的任务,我的应用程序会等到被调用的函数完成后再继续。

WindowsIdentity identity = WindowsIdentity.GetCurrent();
Manager manager = (Manager)Session["Manager"];

ThreadPool.QueueUserWorkItem(new SafeWaitCallback().Call(identity, delegate(object noCallBack)
{
    manager.RunAccountUpdater(identity);
}));

应用程序挂起,直到函数“RunAccountUpdater”完成并发生回调。我做错了什么/不理解?

1 个答案:

答案 0 :(得分:0)

通过你实际做声明的陈述 - 这将是显而易见的。

  

ThreadPool.QueueUserWorkItem(新   SafeWaitCallback()调用(身份,   delegate(object noCallBack){       manager.RunAccountUpdater(身份);   }));

这是从内到外发生的。

  • 您宣布代表。
  • 然后使用SafeWaitCallback()。调用EXECUTE操作。
  • 然后将Call的结果排队到......线程池。

Voila - 这是你的问题。您必须将调用排队到委托,而不是执行的结果。