在asp.net页面和页面创建的后台线程之间共享变量

时间:2011-05-27 13:07:15

标签: c# asp.net multithreading session-variables

我的asp.net Web应用程序中有一个长时间运行的任务,因此我在一个新线程中运行该任务并不断轮询以检查线程的状态(通过使用每5秒滴答一次的回报控件和回发到服务器并检查线程的状态)。我使用Session State来共享线程和页面之间的变量。但我了解到从后台线程访问会话是一种不好的做法。在线程和创建该线程的asp.net页面之间共享变量的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这不是您问题的直接答案,而是建议对长时间运行的作业使用单独的WCF服务。您的Web服务器正忙于处理长任务,我假设使用了大量CPU。

预期的问题

  • Web服务器的整体性能将下降
  • 您将无法扩展此类解决方案

或者,考虑将长时间运行的逻辑放入WCF服务中。您可以通过发出带有作业ID的简单AJAX查询来启动和检查作业状态。每个作业都可以在一个单独的线程中启动,结果/状态保存在一个可查询的存储中。

答案 1 :(得分:1)

我本身并没有看到使用Session的问题 - 它基本上是thread-safe dictionary。您可能需要确保后台主题locks SyncRoot; Page类自动执行此操作。

当然,还有其他选项 - 静态变量(但是你会遇到AppDomain问题),或带外机制(这就是Session),就像数据库或消息服务一样。但是,除非您对这些技术有其他需求,否则Session可能是最简单的。

我能想到的一些警告:

  • 如果会话到期,从后台线程写入会发生什么?例外?保持活力?
  • 如何检测后台线程异常退出?将线程存储在Session中?
  • 如果有unhandled exception on the background thread
  • ,会话会怎样?