/// <summary> /// Auto update the streamgroup /// </summary> /// <param name="entGroup"></param> /// <param name="frequency"></param> /// <param name="onlySendDirtyStates">Only send light states that have been changed since last update</param> /// <param name="cancellationToken"></param> public void AutoUpdate(StreamingGroup entGroup, int frequency = 50, bool onlySendDirtyStates = false, CancellationToken cancellationToken = new CancellationToken()) { if (!_simulator) { int groupCount = (entGroup.Count / 10) + 1; frequency = frequency / groupCount; } else { onlySendDirtyStates = false; //Simulator does not understand partial updates } var waitTime = (int)TimeSpan.FromSeconds(1).TotalMilliseconds / frequency; Task.Run(async() => { int missedMessages = 0; while (!cancellationToken.IsCancellationRequested) { var msg = entGroup.GetCurrentState(forceUpdate: !onlySendDirtyStates); if (msg != null) { Send(msg); } else { missedMessages++; if (missedMessages > frequency) { //If there are no updates, still send updates to keep connection open Send(entGroup.GetCurrentState(forceUpdate: true)); missedMessages = 0; } } await Task.Delay(waitTime).ConfigureAwait(false); } }); }