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

时间:2011-03-13 21:33:03

标签: 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")

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个班级实例,请告诉我你的代码 有人告诉我,我可以使用取消令牌的异步,但由于我在不同的模块中调用类的实例,我很难找到合适的代码示例。 谢谢,

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 tutorialFAQ和许多examples。对于像这样的简单情况,它非常容易使用,但如果您需要更复杂的调度,监视作业,日志记录等,则非常强大。