C# Rest Api 清理数据库中长时间运行操作的结果

问题描述 投票:0回答:1

我计划使用所谓的长时间运行任务。
我已阅读最佳实践文章,并将实现不同的端点来启动、获取此类操作的状态和结果。
此类长时间运行的操作将包括 sql 过程,根据操作 ID 将结果存储在表中。
问题是 - 我应该在什么时候清除结果,从数据库中删除不必要的数据?
我将实现 endpont 来优雅地清除结果,但是如果用户只是关闭网页怎么办? 我应该通过定时器实现后台服务清理结果吗?
预先感谢。

c# rest long-running-processes
1个回答
0
投票

让我们澄清几件事:

  1. 如果用户在您的 Web 应用程序正在执行某些工作时关闭浏览器,这不会阻止您的应用程序完成其工作。只是客户端不会知道操作的状态和结果。

  2. 如果您想检测客户端断开连接并中止您的作业,您应该处理取消令牌。 允许取消长期运行的作业始终是一个好习惯! 要检查客户端是否已断开连接,您可以执行以下操作:

CancellationToken cancellationToken = HttpContext.RequestAborted;

将此令牌传递给您的工作并不断检查它是否被取消。

public void DoSomeWork(CancellationToken cancellationToken)
{
        await Task.Delay(1000, cancellationToken); // Simulate a long process
        
       ...  

 cancellationToken.ThrowIfCancellationRequested(); // Aborts your process and throws an exception
    }

当然,您对数据库执行的操作应该在可回滚事务中运行!

  1. 使用同步 API 控制器操作执行长时间运行的作业并不是一个好习惯。您可以采取的做法是采用作业调度程序。我个人很喜欢 Hangfire https://www.hangfire.io/

您的 Web api 方法应该简单地安排作业并将 JobId 返回给客户端。 Hangfire 为您提供了许多开箱即用的工具,例如监控、重试、优先级队列等,并且它还可以处理取消令牌!

这使您可以更好地控制和了解后台长时间运行的进程。

© www.soinside.com 2019 - 2024. All rights reserved.