F # Запуск / остановка экземпляра класса одновременно - PullRequest
0 голосов
/ 14 марта 2011

Я занимаюсь программированием на 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

Кто-нибудь знает, как остановить все 3 экземпляра класса в 10:00.Пожалуйста, покажите мне ваш код.
Кто-то сказал мне, что я могу использовать async с токенами отмены, но так как я вызываю экземпляр классов в разных модулях, мне трудно найти подходящие примеры кода.Спасибо,

Ответы [ 3 ]

2 голосов
/ 14 марта 2011

Как сказал Брайан, сами рабочие места должны поддерживать отмену. Модель программирования для отмены, которая лучше всего работает с 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 голосов
/ 14 марта 2011

Сами задания должны быть остановлены либо с помощью какого-либо Stop() API, либо совместно отменяемым с помощью CancellationToken s или еще чем-то, если только вы не говорите о какой-то работе, которая вращается в цикле ивы просто прервете его в конце концов?Вам нужно больше информации о том, что означает «стоп» в этом контексте.

1 голос
/ 14 марта 2011

Вы задали этот вопрос на hubfs.net , и я повторю здесь мой ответ: попробуйте использовать Quartz.NET .Вы бы просто внедрили IInteruptableJob в A, B, C, определяя, как они останавливаются.Затем еще одна работа в 10:00, чтобы остановить остальных.

Quartz.NET имеет хороший учебник , FAQ и множество примеров ,Он довольно прост в использовании для таких простых случаев, как этот, но очень мощный, если вам когда-нибудь понадобится более сложное планирование, мониторинг заданий, ведение журнала и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...