【问题标题】:Similar way of doing "add_interval_job" in c#在 c# 中执行“add_interval_job”的类似方法
【发布时间】:2014-09-17 18:17:22
【问题描述】:

我们知道在 Python 中的模块 apscheduler 中有一个函数“add_inverval_job”,它允许我们调度作业,尤其是另一个带有一堆参数的函数。现在我需要在 c# 中实现它。我已经浏览了 Quartz.net。据我了解,要调度的作业应该在继承自 IJob 的类中定义。问题是我要调度的函数(作业)由来自其他类的激发函数和参数组成,并且有很多参数。我发现的所有例子都没有类似的情况。

我想知道 C# 中是否有更好的方法可以帮助我实现这一目标。或者如果有人可以通过 Quartz.net 帮助我。

我要添加的功能是:

private void job_recording(
    string ffmpeg_command, string stream, string cam_ID, int period,
    string vpath, string full_cam_IP, string cam_type, string cam_usr, 
    string cam_pwd)
{
    if (!cam_enabled(cam_ID))
        logger.info ("REC: rec not enabled for %s", cam_ID);
    else
    {
        if (!enable_cam_datetime_setting)
            logger.info('REC: IP camera datetime setting disabled');
        else
        {
            if (cam_type=="axis")
                CSCAMCONFIG.axis_set_datetime(full_cam_IP, cam_usr, cam_pwd);
            else
                logger.info('REC: IP camera datetime not settable');
        }
        string fName=get_fName(cam_ID, period * 60, vpath);
        string command=ffcommand(period, stream, fName);
        //logger
        string rec_process=...;
        set_rec_process(cam_ID, rec_process);
    }
}

【问题讨论】:

    标签: c# python quartz.net


    【解决方案1】:

    看看http://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/more-about-jobs.html

    我认为您需要的是使用 JobDataMap - 本质上是允许您将任意一组参数传递到您的作业处理类中

    所以 - 您可以按如下方式添加作业(代码不可编译!) ....

    IJobDetail job = JobBuilder.Create<RecordingJob>()
        .WithIdentity("myJob", "group1") // name "myJob", group "group1"
        .UsingJobData("ffmpeg_command", "*some command*")
        .UsingJobData("stream", "*some stream*")
          // Add all your other params here ...
        .Build();
    

    你的工作类看起来像这样(同样不可编译)......

    public class RecordingJob : IJob
    {
        public void Execute(JobExecutionContext context)
        {
          JobKey key = context.JobDetail.Key;
    
          JobDataMap dataMap = context.JobDetail.JobDataMap;
    
          string ffmpeg_command= dataMap.GetString("ffmpeg_command");
          float stream= dataMap.GetFloat("stream");
    
          // file out the rest of the parameters
    
          job_recording(ffmpeg_command, stream ...... );
        }
    
            // and your job func here 
         private void job_recording(
                 string ffmpeg_command, string stream, string cam_ID, int period,
                 string vpath, string full_cam_IP, string cam_type, string cam_usr, 
                 string cam_pwd)
         {
            if (!cam_enabled(cam_ID))
                logger.info ("REC: rec not enabled for %s", cam_ID);
            else
            {
                if (!enable_cam_datetime_setting)
                    logger.info('REC: IP camera datetime setting disabled');
                else
                {
                    if (cam_type=="axis")
                        CSCAMCONFIG.axis_set_datetime(full_cam_IP, cam_usr, cam_pwd);
                    else
                        logger.info('REC: IP camera datetime not settable');
                    }
                string fName=get_fName(cam_ID, period * 60, vpath);
                string command=ffcommand(period, stream, fName);
                //logger
                string rec_process=...;
                set_rec_process(cam_ID, rec_process);
            }
        }
    } 
    

    希望有所帮助 加勒特

    【讨论】:

    • 非常感谢,这正是我正在寻找的!还有一件事:您知道是否可以在我的 job_recording 中调用其他函数(例如 cam_enabled())?谢谢
    • 嗨,我不明白为什么不这样做 - 您可以将任何您喜欢的内容添加到 RecordingJob 类中 - 所以如果您在其他地方有 cam_enabled 代码,您也可以将该方法放入您的录制类中
    • 是的,我明白了。再次感谢您的友好回复!
    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多