【问题标题】:ThreadPool.QueueUserWorkItem Causes App to Hang Until FinishedThreadPool.QueueUserWorkItem 导致应用程序挂起直到完成
【发布时间】:2011-05-23 05:14:39
【问题描述】:

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

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

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

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

【问题讨论】:

  • 这里有相关的线程同步代码吗?加入?锁?互斥体?有什么类似于 Control.Invoke 的吗?还有什么可能阻止的吗?
  • new SafeWaitCallback().Call 同步运行。只有它的结果(我假设是一个 WaitCallback)将被安排在 ThreadPool 上。您确定是 manager.RunAccountUpdater 而不是 new SafeWaitCallback().Call 阻止了您的应用程序吗?你能添加SafeWaitCallback类的完整代码吗? (与this 相比,您似乎已对其进行了修改)。

标签: c# asp.net multithreading threadpool


【解决方案1】:

逐句逐句检查你的实际操作 - 这将是显而易见的。

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

这是由内而外发生的。

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

瞧——这是你的问题。您必须对委托人的调用进行排队,而不是对执行结果进行排队。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多