Встроенная система фонового планирования в .NET? - PullRequest
3 голосов
/ 02 июня 2010

Я спрашиваю, хотя я сомневаюсь, что есть такая система.

По сути, мне нужно запланировать выполнение задач в какой-то момент в будущем (обычно не более чем через несколько секунд или, возможно, минут), и у меня есть возможность отменить этот запрос, если не слишком поздно.

Т.е.. код, который будет выглядеть так:

var x = Scheduler.Schedule(() => SomethingSomething(), TimeSpan.FromSeconds(5));
...
x.Dispose(); // cancels the request

Есть ли такая система в .NET? Есть ли в TPL что-нибудь, что может мне помочь?

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

Также обратите внимание, что я не хочу это (или подобное, например, через Задачи):

new Thread(new ThreadStart(() =>
{
    Thread.Sleep(5000);
    SomethingSomething();
})).Start();

Потенциально будет выполнено несколько таких задач, их не нужно выполнять в каком-то конкретном порядке, за исключением того, что они близки к крайнему сроку, и не важно, чтобы у них было что-то вроде концепции производительности в реальном времени. Я просто хочу избежать раскрутки отдельного потока для каждого такого действия.

Ответы [ 6 ]

5 голосов
/ 02 июня 2010

Так как вы не хотите иметь внешнюю ссылку, вы можете взглянуть на System.Threading.Timer или System.Timers.Timer. Обратите внимание, что эти классы технически сильно отличаются от компонента WinForms Timer.

3 голосов
/ 06 июня 2010

Ну ..... На самом деле вы можете делать именно то, что вы просили ....

  IDisposable kill = null;

  kill = Scheduler.TaskPool.Schedule(() => DoSomething(), dueTime);

  kill.Dispose();

Используя Rx Reactive Framework от наших друзей в Microsoft:)

Rx довольно удивительно. Я почти заменил события этим. Это просто вкусно ...

Привет, я Расти, я наркоман Rx ... и мне это нравится.

3 голосов
/ 02 июня 2010

Использование quartz.net (с открытым исходным кодом).

1 голос
/ 06 июня 2010

Если вы хотите использовать .NET 4, то новый System.Threading.Tasks позволяет создавать собственные планировщики для задач. Я не слишком внимательно изучил его, но, похоже, вы можете получить свой собственный планировщик и позволить ему запускать задачи по своему усмотрению.

1 голос
/ 02 июня 2010

Несмотря на то, что это явно не встроено в .NET, задумывались ли вы о создании EXE-файлов, которые можно запланировать с помощью запланированных задач Windows?Если вы используете .NET, вы, вероятно, будете использовать Windows, и разве это не то, для чего предназначены запланированные задачи?

Я не знаю, как интегрировать запланированозадач в решение .NET, но вы наверняка могли бы написать компоненты, которые получают с именем из запланированных задач.

0 голосов
/ 01 февраля 2011

В дополнение к предоставленным ответам это также можно сделать с помощью пула потоков:

public static RegisteredWaitHandle Schedule(Action action, TimeSpan dueTime)
{
    var handle = new ManualResetEvent(false);
    return ThreadPool.RegisterWaitForSingleObject(
                                         handle, 
                                         (s, t) =>
                                         {
                                             action();
                                             handle.Dispose();
                                         }, 
                                         null, 
                                         (int) dueTime.TotalMilliseconds, true);
}

RegisteredWaitHandle имеет метод Unregister , который можно использовать для отмены запроса

...