3

我正在尝试找到保持数据库更新的方法,但是执行此操作的方法会消耗大量时间,因此我尝试创建一个后台任务来执行此操作。

我搜索了解决方案,并阅读了这篇关于运行后台进程的不同选项的文章:https ://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx

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

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

4

2 回答 2

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 应用程序远程触发它们的方法。

于 2017-04-28T08:19:53.587 回答
-1

您可以使用异步方法。只需使用 void 代替 Task。

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

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

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

下面是一个使用 Hangfire 运行日常任务的例子

RecurringJob.AddOrUpdate(() => Console.Write("Easy!"), Cron.Daily);
于 2017-04-28T07:27:58.453 回答