F#同时启动/停止类实例
我在做F#编程,我有一些特殊要求。 我有3个类实例;每个类实例每天必须运行一小时,从上午9:00到上午10:00。我想从主程序控制它们,同时启动它们,同时停止它们。下面是我同时启动它们的代码,但我不知道如何同时停止它们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
#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有一个、多个。对于这样的简单情况,它非常容易使用,但如果您需要更复杂的调度、监视作业、日志记录等,它将非常强大