【问题标题】:Best way to run a background task in ASP.Net web app and also get feedback?在 ASP.Net Web 应用程序中运行后台任务并获得反馈的最佳方式?
【发布时间】:2010-09-28 07:10:09
【问题描述】:

我正在考虑以下方法,但不确定它是否是最好的方法:

第 1 步(服务器端):TaskMangaer 类创建一个新线程并启动一个任务。
step2(服务器端):将 taskManager 对象引用存储到缓存中以供将来参考。
step3(客户端):使用周期性的Ajax调用来检查任务的状态。

基本上,目的是建立一个框架来运行后台任务(大约 5 分钟),并在 Web UI 上定期提供关于任务完成百分比的反馈。

有没有一种巧妙的方法来解决这个问题或任何现有的 asp.net API 会有所帮助?

编辑 1#:我想在应用程序中运行任务。

编辑 2#: 看起来堆栈溢出的徽章实现也在使用缓存来跟踪后台任务。 https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

【问题讨论】:

    标签: asp.net multithreading


    【解决方案1】:

    我在某处看到了解决类似问题的方法。解决方案类似于:

    1. 在服务器上启动后台任务。立即返回结果的 url。
    2. 在结果发布之前,这个url会返回404。
    3. 客户端会定期检查此 url。
    4. 客户端读取结果时 他们终于发布了。

    网址类似于http://mysite/myresults/cffc6c30-d1c2-11dd-ad8b-0800200c9a66。 最好的文档格式可能是 JSON。

    如果对进度的反馈很重要,请修改文档以同时包含状态(进行中/完成)和进度 (42 %)。

    【讨论】:

      【解决方案2】:

      我认为将结果存储在缓存中的问题在于 ASP.NET 可能会出于其他目的(即内存不足、脾气暴躁等)清除该缓存条目。从缓存中提供的内容应该是您可以按需重新创建的内容,如果在缓存中找不到它,ASP.NET 运行时可以随时转储缓存条目。

      徽章讨论中缓存的使用似乎根本不同,在这种情况下,任务是短暂的。缓存只是被用作一个 hacky 计时器来定期触发任务。

      您能否确认这是一个需要 5 分钟的任务,并且一直需要它自己的线程?这本身就是一个性能问题,如果每个请求都需要自己的线程这么长时间,您将只能支持有限数量的此类请求。只有在可以接受的情况下,我才会让任务驻留线程这么久。

      如果这些任务可以驻留线程,那么我会继续将结果存储在进程的全局字典中。字典的键与客户端请求/AJAX 回调系列相关。如果安全性很重要,密钥也应该包含用户 ID。

      如果您需要扩展到许多用户,那么我认为您需要将任务分解为异步步骤,在这种情况下,我可能会使用数据库表来存储结果(再次按请求/用户键入)。

      【讨论】:

      • Frank - 是的,任务大约小于等于 5 分钟。使用静态字典(哈希表是线程安全的)而不是缓存是个好主意。我在给定时间查看 3 到 4 个并行任务。
      • 听起来你已经准备好了。我很好奇您将如何将状态请求与任务相关联,但这并不难。另一个问题是如何清理哈希表(假设客户端可能 DC 并且无法告诉您何时他们不再关心状态更新)。计时器应该可以工作。
      • 是的,哈希表中的任务会自己死掉。我已经为以下任何事件的任务实现了 PopOut 函数: OnComplete,OnError & OnTimeOut 。我只需要模拟多个用户的请求来进一步测试它。到目前为止看起来不错。感谢输入,整理思路。
      • 我使用 UserID+GUID 作为字典中的键 - 在应用程序级别唯一标识任务。
      【解决方案3】:

      执行此操作的一种方法是使用应用程序状态。当您生成工作线程时,将您生成的请求 ID 传递给它,并将其返回给客户端。然后,客户端将在其 AJAX 调用中将该请求 ID 传递回服务器。然后,服务器将使用来自应用程序状态的请求 ID 获取状态。 (工作线程将根据其状态更新应用程序状态)。

      【讨论】:

        【解决方案4】:

        Microsoft 消息队列专为您尝试解决的场景而构建: http://www.microsoft.com/windowsserver2003/technologies/msmq/default.mspx Windows Communicatio Foundation 还具有消息队列支持。 希望这会有所帮助。

        托马斯

        【讨论】:

        • 这是一个有效的选项。我们现在不想扩展到 msmq。只是在寻找 - 在 asp.net 进程范围内使用尽力而为方法的临时后台任务。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        • 2016-09-29
        相关资源
        最近更新 更多