Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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
F#同时启动/停止类实例_F# - Fatal编程技术网

F#同时启动/停止类实例

F#同时启动/停止类实例,f#,F#,我在做F#编程,我有一些特殊要求。 我有3个类实例;每个类实例每天必须运行一小时,从上午9:00到上午10:00。我想从主程序控制它们,同时启动它们,同时停止它们。下面是我同时启动它们的代码,但我不知道如何同时停止它们 #light module Program open ClassA open ClassB open ClassC let A = new CalssA.A("A") let B = new ClassB.B("B") let C = new ClassC.C("C") le

我在做F#编程,我有一些特殊要求。 我有3个类实例;每个类实例每天必须运行一小时,从上午9:00到上午10:00。我想从主程序控制它们,同时启动它们,同时停止它们。下面是我同时启动它们的代码,但我不知道如何同时停止它们

#light
module Program
open ClassA
open ClassB
open ClassC

let A = new CalssA.A("A")
let B = new ClassB.B("B")
let C = new ClassC.C("C")

let task = [ async { return A.jobA("A")};
             async { return B.jobB("B")};
             async { return C.jobC("C")} ]
task |> Async.Parallel |> Async.RunSynchronously |> ignore
任何人都知道如何在上午10:00停止所有3个类实例,请向我展示您的代码。
有人告诉我,我可以将async与取消令牌一起使用,但由于我调用的是不同模块中类的实例,所以很难找到合适的代码示例。
谢谢,

作业本身需要是可停止的,要么通过某种类型的
Stop()
API,要么通过
CancellationToken
s或诸如此类的方式协同取消,除非您只是在谈论循环中旋转的某个作业,并且最终只是线程中止它?需要更多关于“停止”在本文中的含义的信息。

作业本身需要可停止,可以通过某种类型的
stop()
API,也可以通过
CancellationToken
s或其他方式协同取消,除非你只是在谈论某个在循环中旋转的作业,你最终会终止它?需要更多关于“停止”在这种情况下的含义的信息。

正如Brian所说,作业本身需要支持取消。使用F#最有效的取消编程模型基于
CancellationToken
,因为F#在异步工作流中自动保留
CancellationToken

要实现取消,您的
JobA
方法将需要附加参数:

type A() = 
  member x.Foo(str, cancellationToken:CancellationToken) =
    for i in 0 .. 10 do 
      cancellationToken.ThrowIfCancellationRequested() 
      someOtherWork()
这样做的目的是,在执行作业期间,您可以通过wifcancellationrequest频繁调用
。如果请求取消,则方法将停止,操作将停止。完成此操作后,您可以编写异步工作流,获取当前
CancellationToken
,并在调用时将其传递给
JobA
成员:

let task = 
  [ async { let! tok = Async.CancellationToken
            return A.JobA("A", tok) };
    async { let! tok = Async.CancellationToken
            return B.JobB("B") }; ]
现在,您可以使用
CancellationTokenSource
创建一个新的令牌并启动工作流。然后,当您取消令牌源时,它将自动停止作为工作流一部分运行的任何作业:

let src = new CancellationTokenSource()
Async.Start(task, cancellationToken = src.Token)

// To cancel the job:
src.Cancel()

正如Brian所说,工作本身需要支持取消。使用F#最有效的取消编程模型基于
CancellationToken
,因为F#在异步工作流中自动保留
CancellationToken

要实现取消,您的
JobA
方法将需要附加参数:

type A() = 
  member x.Foo(str, cancellationToken:CancellationToken) =
    for i in 0 .. 10 do 
      cancellationToken.ThrowIfCancellationRequested() 
      someOtherWork()
这样做的目的是,在执行作业期间,您可以通过wifcancellationrequest频繁调用
。如果请求取消,则方法将停止,操作将停止。完成此操作后,您可以编写异步工作流,获取当前
CancellationToken
,并在调用时将其传递给
JobA
成员:

let task = 
  [ async { let! tok = Async.CancellationToken
            return A.JobA("A", tok) };
    async { let! tok = Async.CancellationToken
            return B.JobB("B") }; ]
现在,您可以使用
CancellationTokenSource
创建一个新的令牌并启动工作流。然后,当您取消令牌源时,它将自动停止作为工作流一部分运行的任何作业:

let src = new CancellationTokenSource()
Async.Start(task, cancellationToken = src.Token)

// To cancel the job:
src.Cancel()
你问了这个问题,我在这里重复我的答案:尝试使用。您只需在A、B、C中实现
IInteruptableJob
,定义它们如何停止。然后在上午10点做另一件事来阻止其他人

Quartz.NET有一个、多个。对于这样的简单情况,它非常容易使用,但如果您需要更复杂的调度、监视作业、日志记录等,它将非常强大。

您问了这个问题,我将在这里重复我的答案:尝试使用。您只需在A、B、C中实现
IInteruptableJob
,定义它们如何停止。然后在上午10点做另一件事来阻止其他人

Quartz.NET有一个、多个。对于这样的简单情况,它非常容易使用,但如果您需要更复杂的调度、监视作业、日志记录等,它将非常强大