【问题标题】:ASP.NET check on thread status on long running thread?ASP.NET 检查长时间运行线程上的线程状态?
【发布时间】:2009-05-18 14:12:12
【问题描述】:

我遇到用户请求执行长时间运行的过程的情况。我打算在代码隐藏中的另一个线程上启动它并将消息返回给用户“处理”。然后每隔几秒钟左右,我将轮询(通过异步调用)线程的状态。线程完成后,我想显示成功消息。

问题,一旦原始请求完成,我如何轮询线程?

据我了解,Page 对象将分离出一个单独的线程。当请求完成时,Page 对象不再存在……但是那个线程呢?如何获取我创建的那个线程的状态?

【问题讨论】:

    标签: .net asp.net multithreading


    【解决方案1】:

    好吧,您需要一些方法来识别请求。如果您希望能够将其扩展到多台机器,您应该考虑将请求 ID 和当前状态存储在数据库中(或类似的可从任何地方访问的存储)。

    如果你不关心这种情况并且你不担心 AppDomain 回收,你可以只拥有一个从请求 ID 到状态的单例字典 - 但考虑让它在之后自动刷新如果客户只是离开并且不检查状态的一段时间。

    (当然它不必是一个真正的单例——它可以是一些通过依赖注入提供的共享资源,但关键是它需要被共享以某种方式这样你就可以得到它来自新请求。)

    您还可以使用会话支持的对象 - 再次注意有关多服务器网站和 AppDomain 回收的警告。

    【讨论】:

    • 所以,我创建了一个单例类,用于根据原始请求存储(请求 ID、状态)。然后线程将使用该单例类更新状态。然后在任何后续请求中,我都可以通过该单例类检查状态。对吗?
    • 单例将存储“当前请求,状态”的集合是的。但是你最好还是选择一个会话对象,考虑一下。所做的只是将框架中的会话容器视为单例——原理完全相同。不过,您可以使用自己的容器更清楚地看到发生了什么。
    • 就清理而言,当用户请求状态并且状态为“完成”时,我可以从会话中删除“当前请求,状态”对。但是,我仍然需要一种方法来处理用户不请求状态(离开或关闭页面)的情况。有没有标准的清理方法?
    • 好吧,如果会话有与之关联的超时,那么整个会话将在这段时间之后被删除,我想。不过我不是 ASP.NET 专家。
    【解决方案2】:

    我不同意乔恩的回答。您不需要一种识别请求的方法,您需要一种唯一识别您的请求创建的线程的方法。然后您轮询线程的ajax 请求可以检查线程是否已完成执行。我不明白为什么原始请求完全相关......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多