Пример #1
0
 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;
 }
Пример #2
0
            public void Deactivate()
            {
                shouldActive = false;

                if (activity == FeatureActivity.Started || activity == FeatureActivity.StartFailed)
                {
                    activity = FeatureActivity.Stopped;
                    stopper();
                    Debug.Log(log_prefix + "Stop " + featureName + " done.");
                }
            }
Пример #3
0
            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;
                    }
                }
            }