【问题标题】:Sharing variables between an asp.net page and a background thread created by the page在 asp.net 页面和该页面创建的后台线程之间共享变量
【发布时间】:2011-05-28 00:54:05
【问题描述】:

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

【问题讨论】:

  • But I learned that it is a bad practice to access the session from a background thread 它(据说)有什么“坏处”?它只是访问内存中的一个指针。
  • @Cos Callis:我认为它不好的一个明显原因是,如果它是一个长时间运行的任务,会话可能会由于各种原因在完成之前终止。此外,如果用户在多个选项卡中浏览站点,则可能会覆盖值(例如,如果用户尝试对两个不同的参数集执行相同的操作,那么编写覆盖它们的代码非常容易,等等) .
  • @Chris (& @NLV...) 但是如果服务(长时间运行的任务)使用会话作为服务和页面之间的通信层(I used the Session State to share the variables between the thread and the page)那么放弃的会话不应该影响服务,反之亦然......至于多个页面是否会导致冲突,这将是一个场景驱动的问题,可能会或可能不会出现。我仍然不准备同意在这种情况下使用会话是“坏的”。 (虽然可以证明其他东西更好......)
  • @Cos Callis:我承认我没有深思熟虑,但我想说拥有一个可能被其他东西(例如其他页面调用)覆盖的共享资源似乎很糟糕主意。问题是它是页面和服务之间的通信,任何人都可以通过删除、写入其他内容等来搞砸。话虽如此,但没有人提出更好的方法来做到这一点,所以可能是其他技术将其作为最佳解决方案是不切实际的,因此几乎可以定义为不错的做法。 :)

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


【解决方案1】:

我并不认为使用 Session 存在固有的问题 - 它基本上是 thread-safe dictionary。你可能需要确保你的后台线程locksSyncRoot; Page 类会自动执行此操作。

当然,还有其他选项 - 静态变量(但随后您会遇到 AppDomain 问题),或带外机制(即 Session 是什么),如 DB 或消息传递服务。不过,除非您对这些技术有其他需求,否则 Session 可能是最简单的。

我能想到的几个注意事项:

  • 如果会话过期,从后台线程写入时会发生什么?例外?让它活着吗?
  • 如何检测后台线程异常退出?将线程存储在 Session 中?
  • 如果有unhandled exception on the background thread,Session 会发生什么?

【讨论】:

  • 我设计了一个 ThreadStatus 类,它包含有关线程的所有信息,例如进度百分比,线程是否已完成运行,是否已成功完成任务而没有错误,如果不是什么异常等等。当我每 3 或 5 秒进行一次持续轮询时,我认为会话不会过期。
  • @NLV - 不,但如果您的会话在进程内,应用程序重新启动将杀死它。您还需要确保您的 ThreadStatus 是线程安全的; Session 只会同步读/写到它 - 而不是你的班级。
【解决方案2】:

这不是对您问题的直接回答,而是建议为长时间运行的作业使用单独的 WCF 服务。您的 Web 服务器非常忙于处理一项很长的任务,我认为这会占用大量 CPU。

预期问题

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

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

【讨论】:

  • 不错的选择,我认为作为一种良好的设计实践,应该实现这一点,将后端进程与应用程序分开,但将所有逻辑移至单独的服务并不容易。跨度>
猜你喜欢
  • 2014-08-29
  • 1970-01-01
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-22
  • 2012-01-22
相关资源
最近更新 更多