运行后台进程/任务更新数据库

时间:2017-04-28 07:16:22

标签: asp.net asp.net-mvc service quartz.net fluentscheduler

我试图找到保持数据库更新的方法,但是这样做的方法耗费了大量时间,因此我尝试创建后台任务来执行此操作。

我搜索了解决方案,并阅读了本文中有关运行后台流程的不同选项:https://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

但我不知道那些是最好的解决方案,就像我试图在应用程序之外执行它一样。我发现了一些关于创建Windows服务的东西,但我不知道如何,我没有找到一些好的例子。

每次访问应用程序时保持数据库更新的最佳方法是什么,而不会浪费它消耗的时间?如果你能帮助我看到光,我会非常感激。

2 个答案:

答案 0 :(得分:2)

我对FluentScheduler非常满意,它正在处理我的所有关键任务计划。除了按计划发射作业外,它还可以按需执行,如下所示:

// Define your job in its own class

public abstract class MyJob : IJob
{
    public void Execute()
    {
        // Do stuff here...
    }
}

// Schedule your job at startup

var runAt = DateTime.Today.AddHours(1); // 1am
if (runAt<DateTime.Now)
    runAt = runAt.AddDays(1);

Schedule<MyJob>()
    .WithName("My Job Name") // Job name, required for manually triggering
    .NonReentrant() // Only allow one instance to run at a time
    .ToRunOnceAt(runAt) // First execution date/time
    .AndEvery(1).Days().At(runAt.Hour, runAt.Minute); // Run every day at the same time

// To manually trigger your job

ScheduledJobRegistry.RunTaskAsync("My Job Name");

我在Windows服务中运行预定作业,并在需要时使用SignalR作为从MVC Web App远程触发它们的方法。

答案 1 :(得分:-1)

您可以使用异步方法。只需使用void而不是Task。

public async void LongRunningMethod () {
    ...
    // Insert long running code here
    ...
}

然后调用它,它将在后台执行。请注意,如果没有正确处理,您可能会遇到隐藏的异常。

您还可以使用Hangfire这是一个非常棒的后台任务调度程序

以下是使用Hangfire运行每日任务的示例

RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Daily);