Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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调度程序是';我不能活下去_C#_Unit Testing_Quartz.net - Fatal编程技术网

C# Quartz.net调度程序是';我不能活下去

C# Quartz.net调度程序是';我不能活下去,c#,unit-testing,quartz.net,C#,Unit Testing,Quartz.net,在阅读了一些SO问答之后,我选择了推荐的方法,即不编写自己的调度器。我选择使用Quartz.net,因为它看起来正是我所需要的。根据他们的快速入门指南,在我调用调度程序上的shutdown方法之前,应用程序不应在调度程序实例化后关闭: 我正在一个单元测试中对此进行测试,我发现我的nUnit测试正在关闭,而我没有在调度程序上调用shutdown!我把我的调度程序设为一个单例,假设这样可以解决它,但没有这样的运气。这种行为特定于单元测试吗?我假设它发生在我的测试中,以后我在控制台应用程序中使用它时

在阅读了一些SO问答之后,我选择了推荐的方法,即不编写自己的调度器。我选择使用Quartz.net,因为它看起来正是我所需要的。根据他们的快速入门指南,在我调用调度程序上的shutdown方法之前,应用程序不应在调度程序实例化后关闭:

我正在一个单元测试中对此进行测试,我发现我的nUnit测试正在关闭,而我没有在调度程序上调用shutdown!我把我的调度程序设为一个单例,假设这样可以解决它,但没有这样的运气。这种行为特定于单元测试吗?我假设它发生在我的测试中,以后我在控制台应用程序中使用它时也会发生

以下是我如何组合我的计划程序:

public static class Scheduler
{
    public static IScheduler LocalScheduler { get; private set; }

    static Scheduler()
    {
        // get a scheduler
        ISchedulerFactory schedFact = new StdSchedulerFactory();
        LocalScheduler = schedFact.GetScheduler();
    }

    public static void ScheduleJob(IJobDetail job, ITrigger trigger)
    {
        LocalScheduler.ScheduleJob(job, trigger);
    }

    public static void Start()
    {
        if (!LocalScheduler.IsStarted) LocalScheduler.Start();
    }

    public static void Stop()
    {
        LocalScheduler.Shutdown();
    }

}
失败的单元测试尤其是:

    [Test, Explicit]
    public void JobExecutionTest()
    {
        var start = new DateTime(2014,06,01);
        var stop = new DateTime(2014,06,10);

        // I made my own factories for the JobDataMap, IJobDetail, and ITrigger. 
        var jobMap = JobDataFactory.CreateConnectwiseMap(start, stop);
        var job = JobFactory.CreateParameterJob<ConnectwiseJob>("testjob", "testgroup", jobMap);
        // fire in 5 seconds for testing
        var trigger = TriggerFactory.CreateRecurring("testtrigger", "testgroup", DateTime.Now.AddSeconds(5));
        Scheduler.ScheduleJob(job, trigger);
        Scheduler.Start();
        // it shuts down almost immediately!
    }
[测试,显式]
public void作业执行测试()
{
var开始=新日期时间(2014,06,01);
var停止=新日期时间(2014,06,10);
//我为JobDataMap、IJobDetail和ITrigger创建了自己的工厂。
var jobMap=JobDataFactory.CreateConnectwiseMap(开始、停止);
var job=JobFactory.CreateParameterJob(“testjob”、“testgroup”、“jobMap”);
//在5秒内开火进行测试
var trigger=TriggerFactory.createRecurrential(“testtrigger”、“testgroup”、DateTime.Now.AddSeconds(5));
ScheduleJob(作业,触发器);
Scheduler.Start();
//它几乎立即关闭!
}

我在应该执行的作业中放置了一个断点,以查看它是否被命中,但它从来没有被命中,因为单元测试认为一切都完成了,并关闭了一切。如果可以避免的话,我不想使用Thread.Sleep(),因为当我在其他地方使用这个调度程序时,我不希望它处于那种状态。连接侦听器是否可以防止它死机?

使用早期版本的quartz后,我记得调度程序会在一个线程(或更多线程)中启动作业。这也许就是你当时的经历。所以也许你应该用另一种方法来测试


您的计划程序正在关闭,因为测试正在完成并正在对所有内容进行垃圾收集。如果您真的想给调度器时间来完成它的工作,那么您必须找到一种方法,通过在scheduler.Start()之后添加一个Thread.Sleep语句来保持测试的运行;方法


然而,你真的不想用这种方式测试你的工作。您应该模拟iJobeExecutionContext并将其传递给您的作业执行。

文档说它在常规线程池中运行,但没有说明它是否是前台/后台线程。我猜测后台线程是因为应用程序无法保持活动状态?不管怎样,我都会通过使用调度程序运行作业来执行集成测试,但检查预期作业运行的输出/结果,这意味着您必须执行线程。这就是我的想法。我一直在使用Thread.Sleep在我发布问题后,它的工作就像我正在做一段时间jobcount>0旋转之类的事情。我同意mock,我将在单元测试中这样做。关于调度程序在我现在使用它的过程中消亡的问题,我尝试对它进行建模,就像它在实际使用中一样。这是否意味着我仍然需要使用Thread.Sleep或类似的方法来处理它?“在现实世界中”,您可以将调度程序作为独立的windows服务运行,在这种情况下,调度程序将保持活动状态。或者你可以将其嵌入到你的应用程序中,在这种情况下,如果你将其创建为一个单独的应用程序,只要你的应用程序不关闭,你就可以了。是的,我计划将其放入windows服务中。如果在服务启动中放置足够好,并且不需要一段时间(真正的)循环,我将非常高兴!操作。一个石英服务已经完成了…我会得到它,而不是滚动你自己的,或者至少使用它作为一个起点。或者在谷歌上搜索这个文件名:“QuartzServerFactory.cs”。