Quartz.Net F#代码在脚本中运行,但不在主脚本中运行

Quartz.Net F#代码在脚本中运行,但不在主脚本中运行,f#,quartz.net,F#,Quartz.net,我已经把密码放在石英上了 进入VS 2013中的F#源文件。但我把最后一行放在函数中: let start():unit= scheduler.ScheduleJob(job, trigger) |> ignore 当从脚本或主方法调用start()时,它可以正常工作 但是当我改变的时候 type Job () = interface IJob with member x.Execute(context: IJobExecutionContext) =

我已经把密码放在石英上了

进入VS 2013中的F#源文件。但我把最后一行放在函数中:

let start():unit=
    scheduler.ScheduleJob(job, trigger) |> ignore
当从脚本或主方法调用start()时,它可以正常工作

但是当我改变的时候

type Job () =
  interface IJob with
     member x.Execute(context: IJobExecutionContext) =
     Console.WriteLine(DateTime.Now)

调用start()仍然有效(即每秒钟打印一次时间),并且从主方法调用start()不再有效。 我希望调用start()将不再有效,无论它是从脚本还是从源文件调用的

如果有人能解释为什么从脚本文件调用start()仍然有效,我将不胜感激

当您在类型行中省略()时,作业类型不再具有主构造函数。它仍然是一个类,它仍然实现IJob,但代码中没有定义构造函数-在这种情况下,C会添加默认的无参数构造函数,F不会。省略它并不会使Job以任何方式成为接口-我认为您可能希望这样做(使用对象表达式定义接口的具体实例):

现在,我不知道Quartz在调度作业时做了什么,但很可能它试图创建类的实例以调用接口方法——因为构造函数已经不存在了,所以尝试失败了(但我很惊讶它在无声中失败了)

这是从main方法调用时看到的

但是,当从FSI执行相同操作时,像作业类型这样的类型将使用默认的无参数构造函数进行编译。我不知道为什么这两个环境之间存在这种差异,也不知道这是故意的还是一个bug(我假设是后者)


您可以通过对您的类型调用
typeof.GetConstructors()
(从
System.Reflection
)来验证它。结果将在Main和FSI中有所不同。

我在脚本和Main函数中添加了typeof.GetConstructors()。在脚本中,typeof返回[| Void.ctor()|]。它主要返回[| |]。在某种程度上,它以静默方式失败,作业在不同的处理线程上实例化,但会记录错误。未启用错误级别的日志记录通常会导致以下问题。我甚至看到人们在构造函数中执行DB查询,这可能会失败。。。
// omit the (), so that Job is an interface
type Job =
  interface IJob with
     member x.Execute(context: IJobExecutionContext) =
     Console.WriteLine(DateTime.Now)
 let job = 
     { new IJob with
          member this.Execute ...
        }