public FeatureActivator(string featureName, Func <WVR_Result> starter, Func <WVR_Result> initializer, Action stopper) { this.featureName = featureName; this.activity = FeatureActivity.Stopped; this.shouldActive = false; this.coroutineHandle = null; this.starter = starter; this.initializer = initializer; this.stopper = stopper; }
public void Deactivate() { shouldActive = false; if (activity == FeatureActivity.Started || activity == FeatureActivity.StartFailed) { activity = FeatureActivity.Stopped; stopper(); Debug.Log(log_prefix + "Stop " + featureName + " done."); } }
private IEnumerator ActivateCoroutine() { yield return(LiteTask.ToForeground); const long retryInterval = 1000L; var nextRestartTime = default(DateTime); var result = default(WVR_Result); while (true) { if (shouldActive) { switch (activity) { case FeatureActivity.Stopped: activity = FeatureActivity.Starting; break; case FeatureActivity.Starting: break; case FeatureActivity.Started: case FeatureActivity.StartFailed: default: yield break; } } else { switch (activity) { case FeatureActivity.Started: case FeatureActivity.StartFailed: stopper(); Debug.Log(log_prefix + "Stop " + featureName + " done."); activity = FeatureActivity.Stopped; yield break; case FeatureActivity.Starting: case FeatureActivity.Stopped: default: yield break; } } if (DateTime.UtcNow < nextRestartTime) { yield return(null); continue; } yield return(LiteTask.ToBackground); result = starter(); if (result == WVR_Result.WVR_Success) { result = initializer(); } yield return(LiteTask.ToForeground); switch (result) { case WVR_Result.WVR_Error_SystemInvalid: nextRestartTime = DateTime.UtcNow + new TimeSpan(retryInterval * TimeSpan.TicksPerMillisecond); Debug.LogWarning(log_prefix + "Start " + featureName + " fail (system not ready). Retrying in " + retryInterval + " milliseconds..."); yield return(null); break; case WVR_Result.WVR_Success: Debug.Log(log_prefix + "Start " + featureName + " success."); activity = FeatureActivity.Started; break; default: Debug.LogError(log_prefix + "Start " + featureName + " error:" + result); activity = FeatureActivity.StartFailed; break; } } }