Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Quartz.NET中调度高CPU负载的作业_C#_Wcf_C# 4.0_Scheduling_Quartz.net - Fatal编程技术网

C# 在Quartz.NET中调度高CPU负载的作业

C# 在Quartz.NET中调度高CPU负载的作业,c#,wcf,c#-4.0,scheduling,quartz.net,C#,Wcf,C# 4.0,Scheduling,Quartz.net,我正在使用Quartz.NET计划一个作业,该作业从外部源加载一组数据并保存在数据库中。在下载它们之后,还必须对它们进行一些处理,这将在数据库的不同表中创建其他记录 downloader作业是一个有状态作业,每分钟都在运行。我面临的问题是,在下载数据后,处理部分可能需要比我预期的更长的时间 我应该如何处理这个问题?我考虑过在数据下载完成后再创建一个作业(只运行一次)。在这种情况下,downloader作业可以每分钟运行一次(这是原始计划),因为下载部分只需5-20秒,而另一个作业可以在downl

我正在使用Quartz.NET计划一个作业,该作业从外部源加载一组数据并保存在数据库中。在下载它们之后,还必须对它们进行一些处理,这将在数据库的不同表中创建其他记录

downloader作业是一个有状态作业,每分钟都在运行。我面临的问题是,在下载数据后,处理部分可能需要比我预期的更长的时间

我应该如何处理这个问题?我考虑过在数据下载完成后再创建一个作业(只运行一次)。在这种情况下,downloader作业可以每分钟运行一次(这是原始计划),因为下载部分只需5-20秒,而另一个作业可以在downloader作业完成后处理这些记录。processer作业将从数据库中获取标记为未处理的记录,并对其进行处理


这是处理处理处理过程的正确方法吗?我的另一个想法是建立一个WCF服务,它将处理一个下载的元素。这将在每个下载的元素上调用。但是,我不认为这比其他作业方法的性能更好。

您让下载作业计划另一个作业来进行处理的方法是可行的,并且常用


但需要记住的一点是,只要下载作业不总是安排处理作业,这种方法就可以工作。如果您的下载作业总是安排一个作业(例如每分钟一次),并且安排的作业运行时间长于此时间,则最终会耗尽处理线程,并且您的下载作业将不得不等待线程可用。

您可能会考虑为下载作业设置一个线程。只需创建一个实现
IJobListener
接口的类,然后将处理代码放入
JobWasExecuted
方法:

public PostDownloadJobListener : IJobListener
{
    string Name { get { return "MyJobListener"; } }
    void JobToBeExecuted(JobExecutionContext context) { }
    void JobExecutionVetoed(JobExecutionContext context) { }
    void JobWasExecuted(JobExecutionContext context, JobExecutionException jobException)
    {
        // Perform processing here
    }
}

使用
scheduler.AddJobListener(myJobListener)注册侦听器,并让侦听器在作业成功执行后进行处理。

也许更好的方法应该是将作业用作事件,并让另一个服务执行下载

作业将只向另一个端点发送定义意图的消息

这在具有某种消息代理或服务总线(如NServiceBus或MassTransit)的事件驱动体系结构中非常常见

这样,您的调度程序将保持精简和可扩展

以下是一个例子:

public class DownloadFileJob : IJob
{
    public IBus Bus { get; set; }
    public ILogger Logger{ get; set; }

    public void Execute(IJobExecutionContext context)
    {
        Bus.Send(new DownloadFileMessage());
        Logger.Info("Sending message requesting download of file.");
    }
}

处理部分
是CPU限制的操作还是它也涉及大量IO操作?在高负载下,我指的是CPU负载,因此进程中没有大量IO。好的,那么,您是否可以尝试使用TPL并行处理,并查看您是否获得了任何好处,以便在可接受的时间内完成此操作?您的意思是在Quartz.NET作业中使用TPL,该作业也负责下载?我会试试速度有多快,但为了不耽误下一次下载,我想停留在1分钟的时间范围内。嗯,我还没有考虑你提到的可能问题。有什么“推荐”的策略或方法可以防止这种情况吗?您可以在不同的计划程序上运行长时间运行的作业,可能有足够的容量,这样您就不会耗尽线程。谢谢。如果我将downloader作业的优先级设置为high,而将处理的优先级设置为low,那就解决不了问题了?如果你建议在不同的调度程序上运行它们,我想不会,但值得一问。优先级仅用于在两个触发器需要同时触发时断开连接,因此这并不能解决问题。Quartz.net根据触发器的下一次触发时间按顺序运行作业。