gpt4 book ai didi

asp.net-mvc - C#5 .NET MVC长时间异步任务,进度报告和全局取消

转载 作者:行者123 更新时间:2023-12-04 03:07:57 24 4
gpt4 key购买 nike

我使用ASP.Net MVC 5,并且运行时间很长,必须轮询Web服务,处理数据并将其存储在数据库中。

为此,我想使用TPL库启动异步任务。

但是我不知道该怎么做三件事:

  • 我想报告此任务的进度。为此,我考虑SignalR
  • 我希望能够离开从其开始执行此任务的页面,并能够报告整个网站的进度(从左侧面板进行,但这没关系)
  • 我希望能够全局取消此任务(在左侧面板中)

  • 我对所涉及的所有技术了解很多。但是我不确定实现这一目标的最佳方法。

    有人可以帮助我寻求最佳解决方案吗?

    最佳答案

    您想要运行长时间运行的工作,而用户却可以离开启动工作的页面,这一事实表明您需要“在后台”运行此工作。不能将其作为常规HTTP请求的一部分执行,因为用户可以随时通过离开或关闭浏览器来取消其请求。实际上,这对您来说似乎是一个关键场景。

    Background work in ASP.NET is dangerous.当然可以实现,但是很难做到正确。同样,工作进程可能由于多种原因而退出(应用程序池回收,部署,计算机重新启动,计算机故障,堆栈溢出或无关线程上的OOM异常)。因此,请确保您的长期工作不会在中途中断。您可以减少发生这种情况的可能性,但绝不能排除这种可能性。

    通过将所有工作包装在事务中,可以确保面对任意终止的代码安全。当然,这仅在不引起非事务性副作用(例如更改状态的Web服务调用)的情况下才有效。这里不可能给出一般性的答案,因为在任意终止的情况下实现安全性在很大程度上取决于要完成的具体工作。

    这是我过去使用过的一种可能的体系结构:

  • 作业进入时,您将所有必要的输入数据写入数据库表,并向客户端报告成功。
  • 您需要一种方法来启动 worker 来从事该工作。您可以为此立即启动任务。您还需要进行定期检查,以查找未开始的工作,以防应用程序在添加工作项之后但在为其启动任务之前退出。让Windows任务计划程序每分钟一次在您的应用程序中调用一个 secret URL。
  • 当您开始从事一项工作时,请将其标记为“正在运行”,以免再次被意外拿起。完成这项工作,写下结果并将其标记为完成。全部在一次交易中。当您的过程中途退出时,数据库将重置所有涉及的数据。
  • 将作业进度写入到单独的连接和单独的事务上的单独的表行中。浏览器可以轮询服务器以获取进度信息。您也可以使用SignalR,但是我对此没有经验,我希望在存在任意终止的情况下很难恢复它的进度报告。
  • 取消可以通过在进度信息行中设置取消标志来完成。该应用程序需要轮询该标志。

  • 也许您可以利用消息队列进行作业处理,但是我总是很警惕地使用它。要以事务方式处理消息,您需要MSDTC,而SQL Server的许多高可用性解决方案均不支持MSDTC。

    您可能会认为这种体系结构不是很复杂。它利用轮询来处理很多事情。轮询是一种原始技术,但效果很好。它是可靠且易于理解的。它具有一个简单的并发模型。

    如果您可以假设您的应用程序永远不会在不合时宜的情况下退出,那么架构会简单得多。但这不能被假定。您不能假设工作时间内不会进行任何部署,也不会假设会导致崩溃的错误。

    关于asp.net-mvc - C#5 .NET MVC长时间异步任务,进度报告和全局取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19640695/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com