sharee.bike-App/TINKLib/ViewModel/PollingUpdateTaskManager.cs

107 lines
3.8 KiB
C#
Raw Normal View History

2021-05-13 20:03:07 +02:00
using Serilog;
using System;
using TINK.Settings;
using System.Threading.Tasks;
namespace TINK.ViewModel
{
/// <summary>
/// Performs a periodic update.
/// </summary>
public class PollingUpdateTaskManager : IPollingUpdateTaskManager
{
/// <summary>Name of child class provider. </summary>
private readonly Func<string> m_oGetChildName;
/// <summary> Action which performs an update.</summary>
private Action m_oUpdateAction;
/// <summary> Reference on the current polling task</summary>
private PollingUpdateTask m_oPollingUpdateTask;
/// <summary>
/// Gets or sets polling parameters.
/// </summary>
private PollingParameters PollingParameters { get; set; }
/// <summary> Prevents an invalid instance to be created. </summary>
private PollingUpdateTaskManager()
{ }
/// <summary>Constructs a update manager object. </summary>
/// <param name="p_oGetChildName">Name of the child class. For logging purposes.</param>
/// <param name="p_oUpdateAction"></param>
public PollingUpdateTaskManager(
Func<String> p_oGetChildName,
Action p_oUpdateAction)
{
m_oGetChildName = p_oGetChildName ?? throw new ArgumentException(
$"Can not construct {GetType().Name}- obect. Argument {nameof(p_oGetChildName)} must not be null.");
m_oUpdateAction = p_oUpdateAction ?? throw new ArgumentException(
$"Can not construct {GetType().Name}- obect. Argument {nameof(p_oUpdateAction)} must not be null.");
}
/// <summary>
/// Invoked when page is shown.
/// Actuates and awaits the first update process and starts a task wich actuate the subseqent update tasks.
/// </summary>
/// <param name="pollingParameters">Parametes holding polling periode, if null last parameters are used if available.</param>
public async Task StartUpdateAyncPeridically(PollingParameters pollingParameters = null)
{
if (m_oPollingUpdateTask != null)
{
Log.Error($"Call to stop periodic update task missed in context {GetType().Name} at {DateTime.Now}.");
// Call of StopUpdatePeriodically missed.
// Terminate running polling update task before starting a new one
await m_oPollingUpdateTask.Terminate();
}
if (pollingParameters != null)
{
// Backup polling parameter for purposee of restart.
PollingParameters = pollingParameters;
}
if (PollingParameters == null)
{
// No polling parameters avaialable.
Log.Error($"Can not start polling. No parameters available.");
return;
}
if (!PollingParameters.IsActivated)
{
// Automatic supdate is switched off.
Log.ForContext<PollingUpdateTask>().Debug($"Automatic update is off, context {GetType().Name} at {DateTime.Now}.");
return;
}
m_oPollingUpdateTask = new PollingUpdateTask(
m_oGetChildName,
m_oUpdateAction,
PollingParameters.Periode);
}
/// <summary>
/// Invoked when pages is closed/ hidden.
/// Stops update process.
/// </summary>
public async Task StopUpdatePeridically()
{
if (m_oPollingUpdateTask == null)
{
// Nothing to do if there is no update task pending.
return;
}
await m_oPollingUpdateTask.Terminate();
m_oPollingUpdateTask = null;
}
}
}