我的asp.net Web应用程序中有一个长时间运行的任务,因此我在一个新线程中运行该任务并不断轮询以检查线程的状态(通过使用每5秒滴答一次的回报控件和回发到服务器并检查线程的状态)。我使用Session State来共享线程和页面之间的变量。但我了解到从后台线程访问会话是一种不好的做法。在线程和创建该线程的asp.net页面之间共享变量的最佳方法是什么?
答案 0 :(得分:1)
这不是您问题的直接答案,而是建议对长时间运行的作业使用单独的WCF服务。您的Web服务器正忙于处理长任务,我假设使用了大量CPU。
预期的问题
或者,考虑将长时间运行的逻辑放入WCF服务中。您可以通过发出带有作业ID的简单AJAX查询来启动和检查作业状态。每个作业都可以在一个单独的线程中启动,结果/状态保存在一个可查询的存储中。
答案 1 :(得分:1)
我本身并没有看到使用Session的问题 - 它基本上是thread-safe dictionary。您可能需要确保后台主题locks SyncRoot; Page类自动执行此操作。
当然,还有其他选项 - 静态变量(但是你会遇到AppDomain问题),或带外机制(这就是Session),就像数据库或消息服务一样。但是,除非您对这些技术有其他需求,否则Session可能是最简单的。
我能想到的一些警告: