2010-12-10 105 views
3

这可能是由于缺乏对底层操作的理解,或者仅仅是缺乏对线程的理解。当用户登录时,我需要运行一些调用Web服务的任务来更新系统中的数据。由于服务可能需要相当长的时间,因此我将整个过程贯穿始终。但是,即使我认为我在与应用程序分离的线程中运行了整个系列任务,我的应用程序仍会一直等到被调用函数完成后再继续。ThreadPool.QueueUserWorkItem导致应用程序挂起直至完成

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

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

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

+3

这里有任何相关的线程同步代码吗?加入?锁?互斥?任何类似于Control.Invoke?还有什么可能会阻止? – 2010-12-10 00:37:11

回答

0

经过你实际上有声明的声明 - 这将是明显的。

ThreadPool.QueueUserWorkItem(新 SafeWaitCallback()调用(身份, 委托(对象noCallBack){ manager.RunAccountUpdater(身份); }。));

这发生在内部。

  • 您声明了一个委托。
  • 然后您使用SafeWaitCallback()。调用EXECUTE操作。
  • 然后您将调用的结果排队到....线程池。

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