【发布时间】:2011-06-02 07:27:32
【问题描述】:
我想创建一个网页,用户可以在其中启动一个过程,这个过程需要几分钟才能完成。
我的问题是:
当用户点击一个按钮时,我应该在不同的线程上启动进程并将他发送到不同的页面吗?如果他关闭窗口或连接丢失,我不希望该过程结束。
另外,我怎样才能阻止其他用户启动此过程。
我想过在应用程序状态中放置一个变量来指示进程当前是否正在运行。
感谢您的建议
【问题讨论】:
标签: c# asp.net multithreading
我想创建一个网页,用户可以在其中启动一个过程,这个过程需要几分钟才能完成。
我的问题是:
当用户点击一个按钮时,我应该在不同的线程上启动进程并将他发送到不同的页面吗?如果他关闭窗口或连接丢失,我不希望该过程结束。
另外,我怎样才能阻止其他用户启动此过程。
我想过在应用程序状态中放置一个变量来指示进程当前是否正在运行。
感谢您的建议
【问题讨论】:
标签: c# asp.net multithreading
如果这是一个长时间运行的进程,最好将其移到服务中。通过这种方式,您可以水平缩放它。如果你把它留在网站上,一旦负载很大,你就需要重构你的代码。
服务可以有一个长时间运行的操作请求队列。在给定的时刻,该服务将处理一个/两个/任何项目。根据您的需要,您可以将操作结果及其当前状态保存到存储中。
表示层启动操作(用户按下按钮),然后轮询存储以获取结果,完成后将结果从存储传递给用户。
【讨论】:
您可以生成一个将要完成工作的线程并定期检查它是否仍应继续他的工作。对于工作,您会生成一个特定的 ID(您可能会或可能不会将其与用户耦合以获得额外的安全性),该 ID 将用于区分工作作业。在重定向页面上,您可以使用一些 javascript 告诉服务器用户仍在等待 ID X 的作业。如果超时到期,您可以放弃该作业。
更新:如果您只希望一个人激活该过程,那么如果您想保留某种历史记录,您仍然可以使用静止系统。您只需将登录页面更改为始终查看最新进程并在仍有进程运行时阻止其他进程启动。
否则,您可以执行与上述系统相同的操作,但对处理结果使用单个存储点。如果存储点包含一个占位符,则表明该进程已经启动并且没有人应该启动一个新进程。然后,显示页面可以针对此存储点轮询信息以向用户显示。
如果您希望每个人都能够在执行新流程时看到当前结果,请使用两个位置来存储结果,一个用于存储已完成的位置,另一个用于存储忙碌的位置。
【讨论】: