我在做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点停止所有3个班级实例,请告诉我你的代码 有人告诉我,我可以使用取消令牌的异步,但由于我在不同的模块中调用类的实例,我很难找到合适的代码示例。 谢谢,
答案 0 :(得分:2)
作业本身需要是可以停止的,要么通过某种Stop()
API,要么可以通过CancellationToken
或其他方式合作取消,除非你只是谈论一些旋转的工作在一个循环中你最终会线程中止它?需要更多关于“停止”在这种情况下意味着什么的信息。
答案 1 :(得分:2)
正如Brian所说,这些工作本身需要支持取消。使用F#进行最佳排序的取消编程模型基于CancellationToken
,因为F#会在异步工作流中自动保留CancellationToken
。
要实施取消,您的JobA
方法需要采取其他参数:
type A() =
member x.Foo(str, cancellationToken:CancellationToken) =
for i in 0 .. 10 do
cancellationToken.ThrowIfCancellationRequested()
someOtherWork()
您的想法是在执行工作期间经常致电ThrowIfCancellationRequested
。如果要求取消,方法将停止并且操作将停止。执行此操作后,您可以编写获取当前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()
答案 2 :(得分:1)
您问了这个question on hubfs.net,我将在此重复我的回答:尝试使用Quartz.NET。你只需在A,B,C中实现IInteruptableJob
,定义它们如何停止。然后在上午10点另一份工作来阻止其他工作。
Quartz.NET有一个nice tutorial,FAQ和许多examples。对于像这样的简单情况,它非常容易使用,但如果您需要更复杂的调度,监视作业,日志记录等,则非常强大。