【问题标题】:Background task in ASP.NETASP.NET 中的后台任务
【发布时间】:2013-08-19 12:05:22
【问题描述】:

我正在使用 ASP.NET(不是 MVC)和 .NET v4(不是 v4.5)编写一个 Web 应用程序。

我从第 3 方 Web 服务中获取了一些我必须显示的数据,其中一种方法需要很长时间(几秒钟)才能完成。要获取/预取的信息因用户的初始请求而异(因为不同的用户要求不同对象的详细信息)。

在单用户桌面应用程序中,我可能会:

  • 尽快显示我的用户界面
  • 有非 UI 后台任务提前获取信息
  • 因此希望在用户深入到 UI 以请求它时,已经获得/缓存的数据版本

要使用 ASP.NET 做类似的事情,我想我可以:

  • 使用 BackgroundWorker,将 Session 实例作为参数传递给 worker
  • worker 任务完成后,将获取的数据写入 Session
  • 如果用户的数据请求在任务完成之前到达,则阻塞直到它完成

您是否预见到问题,您能提出改进建议吗?

[StackOverflow 上还有其他关于 ASP.NET 和后台任务的问题,但这些似乎都是关于获取和更新全局应用程序数据,而不是特定于会话的数据。]

【问题讨论】:

    标签: asp.net backgroundworker session-state


    【解决方案1】:

    为什么不使用与桌面应用程序相同的规则:

    1. 在没有来自服务的数据的情况下加载页面 (= Display my UI as quickly as possible)
    2. 使用 ajax 调用获取服务数据 (= Have a non-UI background task to fetch the information in advance)
    3. 这实际上是一样的,虽然你可以显示一个动画 gif 来表明你仍在进行中......(Therefore hope have an already-fetched/cached version of the data, by the time the user drills down into the UI to request it

    为了发布示例代码,了解您是否使用 jquery 会很有帮助?纯JavaScript?别的东西?没有javascript?

    编辑
    我不确定这是否是您的计划,但另一个想法是在服务器端也获取数据,并为将来的请求缓存数据。
    在这种情况下,阶段将是:

    1. 获取请求。
    2. 是否缓存了服务数据?
      2.a. 是吗? 发布包含完整数据的页面。
      2.b。 否? 发布没有服务数据的页面。
      2.b.i.在服务器端获取服务数据并将其缓存以供将来的请求使用。
      2.b.ii。在客户端获取服务数据并将其缓存以供当前会话使用。

    编辑 2:
    请记住,该规则的缺点是,如果您获取数据的方法发生变化,您必须记住在服务器端和客户端都对其进行修改。

    【讨论】:

    • 我目前正在使用一些普通的 javascript 并且会/可以使用 jquery。如果我使用 ajax,如果用户在请求完成之前尝试导航/向下钻取,会发生什么情况?例如,顶级页面应立即显示“您已选择对象 'ABC';您可以查看其 'Foo'、'Bar' 和 'Baz' 组件的详细信息”。并有一些数据(来自更快的来源)供用户查看。一旦我知道他们对 ABC 感兴趣,我也想开始获取较慢的数据,以便在他们单击任何 Foo/Bar/Baz 组件时可用。
    • 我目前正在使用类似 REST 的 URL,例如 http:example.com/Report.aspx?id=ABChttp:example.com/Report.aspx?id=ABC&sub=Foo
    • 使用 jQuery 可以很容易地使用事件并更改用户可以做什么和不能做什么。我认为向他显示消息/动画 gif 以通知他正在进行中是合理的。这对你不起作用吗?
    • 我不明白使用 Ajax 的好处。我的第一个想法(可能是错误的/狭隘的)是仅在服务器上存储和使用数据,以便在用户导航时使用/重用,例如从 Foo 到 Bar 组件。需要很长时间的方法是返回“目录”或分类的单一方法,它告诉我哪些进一步的数据可用于所有(每个)组件。当用户选择任何组件时,服务器必须等待单个 ABC 目录获取完成,这会告诉我随后可以为任何/每个组件获取哪些数据。
    • I am not sure if this was your plan -- 如果目录尚未到达,我的计划是同步阻止用户对组件的页面请求/线程,可能通过让 BackgroundWorker 设置 EventWaitHandle 或 AutoResetEvent用户过早的 Page_Load 可以等待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2013-07-18
    相关资源
    最近更新 更多