【问题标题】:Completely fire and forget stored procedure C# .NET Core完全触发并忘记存储过程 C# .NET Core
【发布时间】:2018-09-17 14:39:54
【问题描述】:

我有一个每月运行的 T-SQL 存储过程,大约需要 48 小时才能完成。我单击客户端应用程序上的按钮以调用 C# .NET Core API 上的路由。 API 然后调用存储过程。我不希望它以任何形式或方式等待。我在函数周围添加了Task.Run()

Task.Run(() => db.Database.ExecuteSqlCommand("dbo.storedProcedure"));

这会根据需要立即成功地向客户端返回响应,但是 API 仍在后台等待此过程。

有没有一种方法可以调用该过程并让 API 完全完成它?我只想启动它,让它纯粹在数据库上运行。对于这种情况,我不关心捕获错误或其他可能被视为良好做法的操作。

【问题讨论】:

  • 避免让客户端手动创建作业。考虑服务器端作业(SQL Server 代理、Windows 计划任务等)。如果您需要编写代码,有很好的 .net 调度程序,例如 quartz
  • 我尝试使用 Azure runbooks/scheduler 启动存储过程,但它似乎每隔几个小时就会重新启动一次连接,在整个过程中将存储过程弄乱了一小部分。此外,我组织中的用户正在选择何时从客户端运行该过程。我打算研究使用 SQL 代理。
  • Core中有Background tasks,样本为on-demand execution。但最终,如果应用程序由于某种原因重新启动,此调用仍将终止。

标签: c# sql-server linq tsql asp.net-core


【解决方案1】:

也许在执行存储过程的 SQL 代理(没有关联的计划)中创建一个作业,然后从您的客户端应用程序启动该作业。可能需要不同的权限,但会断开您的应用程序与程序运行的连接,这听起来像是您想要实现的目标。

【讨论】:

  • 我会调查的。我不熟悉 SQL 作业。感谢您的建议。
  • 作为一项附加功能,如果 SQL Server 代理作业失败,您会很容易注意到,启用失败时的电子邮件通知,检查执行历史记录等......
  • 这可能是题外话,但我会敦促研究 sproc 的作用,因为运行 48 小时是一项相当长的任务。为了提高性能,可能会对其进行返工。它甚至支持日志记录和回滚吗?我建议将不同的任务分成不同的工作单元。
猜你喜欢
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
相关资源
最近更新 更多