2009-05-18 115 views
0

我有一种情况,用户请求执行长时间运行的进程。我计划在代码隐藏的另一个线程上启动它,并将消息返回给用户“处理”。然后每隔几秒钟左右我会轮询(通过异步调用)其状态的线程。线程完成后,我想显示成功消息。ASP.NET在长时间运行的线程上检查线程状态?

问题,我怎么轮询线程一旦原始请求是否已经完成?

据我明白,页对象将分拆一个单独的线程。当请求完成时,Page对象不再存在......但那个线程呢?我如何获得我创建的该线程的状态?

回答

3

那么,你就需要标识请求的一些方式。如果您希望能够扩展到多台计算机,您应该考虑将请求ID和当前状态存储在数据库中(或某些类似可从任何地方访问的存储)。

如果你不关心这种情况你不担心的AppDomain回收,只是你可以从请求ID到状态的单身字典 - 但可以考虑将它自动一段时间,如果冲洗后本身客户端就会消失并且不检查状态。 (当然,它不一定是一个真正的单身人士 - 它可能是一些提供依赖注入的共享资源,但重点是需要共享,所以你可以从新的请求)

你也可能使用会话支持的对象 - 与有关多服务器网站和AppDomain回收再警告。

+0

所以,我创建原始请求的一个单例类,存储(请求ID,状态)。那么线程将通过使用该单例类来更新状态。那么在任何后续的请求中,我都可以通过该单例类来检查状态。那是对的吗? – 2009-05-18 14:22:50

0

我不同意乔恩的答案。您不需要识别请求的方式,您需要一种唯一标识您的请求创建的线程的方式。然后,您的ajax请求轮询线程可以检查线程是否完成执行。我不明白为什么原来的请求是在所有有关...