using System;
using System.Threading.Tasks;
using ZeroLevel.Services.Shedulling;
namespace ZeroLevel
{
///
/// Планировщик по умолчанию, предназначен для служебных задач
///
public static class Sheduller
{
#region Factory
public static IExpirationSheduller CreateExpirationSheduller()
{
return new DateTimeSheduller();
}
public static IExpirationAsyncSheduller CreateAsyncExpirationSheduller()
{
return new DateTimeAsyncSheduller();
}
public static ISheduller Create()
{
return new ShedullerImpl();
}
public static IAsyncSheduller CreateAsync()
{
return new AsyncShedullerImpl();
}
#endregion
#region Singletones
private static ISheduller __instanse;
private static readonly object _create_lock = new object();
private static ISheduller DefaultInstance
{
get
{
if (__instanse == null)
{
lock (_create_lock)
{
if (__instanse == null)
{
__instanse = Sheduller.Create();
}
}
}
return __instanse;
}
}
private static IAsyncSheduller __async_instance;
private static readonly object _async_create_lock = new object();
private static IAsyncSheduller DefaultAsyncInstance
{
get
{
if (__async_instance == null)
{
lock (_create_lock)
{
if (__async_instance == null)
{
__async_instance = Sheduller.CreateAsync();
}
}
}
return __async_instance;
}
}
#endregion
#region Sync default instance api
public static long RemindWhile(TimeSpan timespan, Func callback, Action continueWith = null)
{
return DefaultInstance.RemindWhile(timespan, callback, continueWith);
}
public static long RemindWhile(TimeSpan timespan, Func callback, Action continueWith = null)
{
return DefaultInstance.RemindWhile(timespan, (k) => callback(), continueWith);
}
public static long RemindAfter(TimeSpan timespan, Action callback)
{
return DefaultInstance.RemindAfter(timespan, callback);
}
public static long RemindAfter(TimeSpan timespan, Action callback)
{
return DefaultInstance.RemindAfter(timespan, k => callback());
}
public static long RemindAt(DateTime date, Action callback)
{
return DefaultInstance.RemindAt(date, callback);
}
public static long RemindAt(DateTime date, Action callback)
{
return DefaultInstance.RemindAt(date, k => callback());
}
public static long RemindEvery(TimeSpan first, TimeSpan next, Action callback)
{
return DefaultInstance.RemindEvery(first, next, callback);
}
public static long RemindEvery(TimeSpan first, TimeSpan next, Action callback)
{
return DefaultInstance.RemindEvery(first, next, k => callback());
}
public static long RemindEvery(TimeSpan timespan, Action callback)
{
return DefaultInstance.RemindEvery(timespan, callback);
}
public static long RemindEvery(TimeSpan timespan, Action callback)
{
return DefaultInstance.RemindEvery(timespan, k => callback());
}
///
/// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчета следующего периода
/// Действие
/// Идентификатор задания
public static long RemindEveryNonlinearPeriod(Func nextEventPeriodCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearPeriod(nextEventPeriodCalcFunction, nextEventPeriodCalcFunction, callback);
}
public static long RemindEveryNonlinearPeriod(Func nextEventPeriodCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearPeriod(nextEventPeriodCalcFunction, nextEventPeriodCalcFunction, k => callback());
}
///
/// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчета периода до первого исполнения
/// Функция для расчета периода до последующих исполнений
/// Действие
/// Идентификатор задания
public static long RemindEveryNonlinearPeriod(Func firstEventPeriodCalcFunction, Func nextEventPeriodCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearPeriod(firstEventPeriodCalcFunction, nextEventPeriodCalcFunction, callback);
}
public static long RemindEveryNonlinearPeriod(Func firstEventPeriodCalcFunction, Func nextEventPeriodCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearPeriod(firstEventPeriodCalcFunction, nextEventPeriodCalcFunction, k => callback());
}
///
/// Исполняет действие раз в период, при этом дата перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчета следующей даты
/// Действие
/// Идентификатор задания
public static long RemindEveryNonlinearDate(Func nextEventDateCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearDate(nextEventDateCalcFunction, nextEventDateCalcFunction, callback);
}
public static long RemindEveryNonlinearDate(Func nextEventDateCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearDate(nextEventDateCalcFunction, nextEventDateCalcFunction, k => callback());
}
///
/// Исполняет действие раз в период, при этом дата перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчет даты первого запуска
/// Функция для расчета следующей даты
/// Действие
/// Идентификатор задания
public static long RemindEveryNonlinearDate(Func firstEventDateCalcFunction,
Func nextEventDateCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearDate(firstEventDateCalcFunction, nextEventDateCalcFunction, callback);
}
public static long RemindEveryNonlinearDate(Func firstEventDateCalcFunction,
Func nextEventDateCalcFunction, Action callback)
{
return DefaultInstance.RemindEveryNonlinearDate(firstEventDateCalcFunction, nextEventDateCalcFunction, k => callback());
}
public static bool Remove(long key)
{
return DefaultInstance.Remove(key);
}
#endregion
#region Async default instance api
public static long RemindAsyncWhile(TimeSpan timespan, Func> callback, Action continueWith = null)
{
return DefaultAsyncInstance.RemindAsyncWhile(timespan, callback, continueWith);
}
public static long RemindAsyncWhile(TimeSpan timespan, Func> callback, Action continueWith = null)
{
return DefaultAsyncInstance.RemindAsyncWhile(timespan, (k) => callback(), continueWith);
}
public static long RemindAsyncAfter(TimeSpan timespan, Func callback)
{
return DefaultAsyncInstance.RemindAsyncAfter(timespan, callback);
}
public static long RemindAsyncAfter(TimeSpan timespan, Func callback)
{
return DefaultAsyncInstance.RemindAsyncAfter(timespan, async k => await callback());
}
public static long RemindAsyncAt(DateTime date, Func callback)
{
return DefaultAsyncInstance.RemindAsyncAt(date, callback);
}
public static long RemindAsyncAt(DateTime date, Func callback)
{
return DefaultAsyncInstance.RemindAsyncAt(date, async k => await callback());
}
public static long RemindAsyncEvery(TimeSpan first, TimeSpan next, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEvery(first, next, callback);
}
public static long RemindAsyncEvery(TimeSpan first, TimeSpan next, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEvery(first, next, async k => await callback());
}
public static long RemindAsyncEvery(TimeSpan timespan, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEvery(timespan, callback);
}
public static long RemindAsyncEvery(TimeSpan timespan, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEvery(timespan, async k => await callback());
}
///
/// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчета следующего периода
/// Действие
/// Идентификатор задания
public static long RemindAsyncEveryNonlinearPeriod(Func nextEventPeriodCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearPeriod(nextEventPeriodCalcFunction, nextEventPeriodCalcFunction, callback);
}
public static long RemindAsyncEveryNonlinearPeriod(Func nextEventPeriodCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearPeriod(nextEventPeriodCalcFunction, nextEventPeriodCalcFunction, async k => await callback());
}
///
/// Исполняет действие раз в период, при этом период перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчета периода до первого исполнения
/// Функция для расчета периода до последующих исполнений
/// Действие
/// Идентификатор задания
public static long RemindAsyncEveryNonlinearPeriod(Func firstEventPeriodCalcFunction, Func nextEventPeriodCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearPeriod(firstEventPeriodCalcFunction, nextEventPeriodCalcFunction, callback);
}
public static long RemindAsyncEveryNonlinearPeriod(Func firstEventPeriodCalcFunction, Func nextEventPeriodCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearPeriod(firstEventPeriodCalcFunction, nextEventPeriodCalcFunction, async k => await callback());
}
///
/// Исполняет действие раз в период, при этом дата перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчета следующей даты
/// Действие
/// Идентификатор задания
public static long RemindAsyncEveryNonlinearDate(Func nextEventDateCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearDate(nextEventDateCalcFunction, nextEventDateCalcFunction, callback);
}
public static long RemindAsyncEveryNonlinearDate(Func nextEventDateCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearDate(nextEventDateCalcFunction, nextEventDateCalcFunction, async k => await callback());
}
///
/// Исполняет действие раз в период, при этом дата перерасчитывается по переданной функции при каждом пересоздании задачи
///
/// Функция для расчет даты первого запуска
/// Функция для расчета следующей даты
/// Действие
/// Идентификатор задания
public static long RemindAsyncEveryNonlinearDate(Func firstEventDateCalcFunction,
Func nextEventDateCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearDate(firstEventDateCalcFunction, nextEventDateCalcFunction, callback);
}
public static long RemindAsyncEveryNonlinearDate(Func firstEventDateCalcFunction,
Func nextEventDateCalcFunction, Func callback)
{
return DefaultAsyncInstance.RemindAsyncEveryNonlinearDate(firstEventDateCalcFunction, nextEventDateCalcFunction, async k => await callback());
}
public static bool RemoveAsync(long key)
{
return DefaultAsyncInstance.Remove(key);
}
#endregion
#region Default instances control
public static void Pause()
{
DefaultInstance.Pause();
DefaultAsyncInstance.Pause();
}
public static void Resume()
{
DefaultInstance.Resume();
DefaultAsyncInstance.Resume();
}
public static void Clean()
{
DefaultInstance.Clean();
DefaultAsyncInstance.Clean();
}
public static void Dispose()
{
DefaultAsyncInstance.Dispose();
DefaultInstance.Dispose();
}
#endregion
}
}