public Task Custom(IData[] customList, IPushDataController deviceObserver, int durationMs, int? loop = null)
{
var taskSource = new TaskCompletionSource<bool>();
if (customList == null || customList.Length == 0)
throw new ArgumentNullException("customList");
CancellationTokenSource cancelSource = null;
var observer = Observer.Create<long>(
onNext: elapsedMs =>
{
if (loop.HasValue)
{
long loopCounter = elapsedMs / durationMs;
if (loopCounter >= loop.Value)
{
foreach (var kvp in customList[customList.Length - 1])
deviceObserver.Data[kvp.Key] = kvp.Value;
deviceObserver.PushData();
log.Debug("Cancel 9");
cancelSource.Cancel();
return;
}
}
double instanceMs = elapsedMs % durationMs;
int pos = (int)(customList.Length * instanceMs / durationMs);
foreach (var kvp in customList[pos])
deviceObserver.Data[kvp.Key] = kvp.Value;
deviceObserver.PushData();
},
onCompleted: () =>
{
taskSource.SetResult(true);
});
cancelSource = this.timerJobRunner.AddTimerJobMs(observer, loop.HasValue ? durationMs * loop.Value : (long?)null);
Executor.Current.SetManagedTask(taskSource.Task, cancelSource);
return taskSource.Task;
}