public Task <AVInstallation> GetAsync(CancellationToken cancellationToken)
        {
            AVInstallation cachedCurrent;

            cachedCurrent = CurrentInstallation;

            if (cachedCurrent != null)
            {
                return(Task <AVInstallation> .FromResult(cachedCurrent));
            }

            return(taskQueue.Enqueue(toAwait => {
                return toAwait.ContinueWith(t => {
                    object temp;
                    AVClient.ApplicationSettings.TryGetValue("CurrentInstallation", out temp);
                    var installationDataString = temp as string;
                    AVInstallation installation = null;
                    if (installationDataString != null)
                    {
                        var installationData = AVClient.DeserializeJsonString(installationDataString);
                        installation = AVObject.CreateWithoutData <AVInstallation>(null);
                        installation.HandleFetchResult(AVObjectCoder.Instance.Decode(installationData, AVDecoder.Instance));
                    }
                    else
                    {
                        installation = AVObject.Create <AVInstallation>();
                        installation.SetIfDifferent("installationId", installationIdController.Get().ToString());
                    }

                    CurrentInstallation = installation;
                    return installation;
                });
            }, cancellationToken));
        }
        public Task <ParseInstallation> GetAsync(CancellationToken cancellationToken)
        {
            ParseInstallation cachedCurrent;

            cachedCurrent = CurrentInstallation;

            if (cachedCurrent != null)
            {
                return(Task <ParseInstallation> .FromResult(cachedCurrent));
            }

            return(taskQueue.Enqueue(toAwait => {
                return toAwait.ContinueWith(t => {
                    object temp;
                    ParseClient.ApplicationSettings.TryGetValue("CurrentInstallation", out temp);
                    var installationDataString = temp as string;
                    ParseInstallation installation = null;
                    if (installationDataString != null)
                    {
                        var installationData = ParseClient.DeserializeJsonString(installationDataString);
                        var state = ParseObjectCoder.Instance.Decode(installationData, ParseDecoder.Instance);
                        installation = ParseObject.FromState <ParseInstallation>(state, "_Installation");
                    }
                    else
                    {
                        installation = ParseObject.Create <ParseInstallation>();
                        installation.SetIfDifferent("installationId", installationIdController.Get().ToString());
                    }

                    CurrentInstallation = installation;
                    return installation;
                });
            }, cancellationToken));
        }