Как сохранить настройки в IsolatedStorage, когда активен экземпляр BackgroundAudioPlayer?

У меня есть два проекта в моем решении. Скажем, проект А и проект Б.

Проект А

Это основной проект и имеет настройки. У меня есть флажок, чтобы дать пользователю возможность "Повторять" трек (ы). Этот проект может также получить доступ к публичным экземплярам ПРОЕКТА B.

Проект Б

Это BackgroundAudioAgent с собственными настройками. Этот проект не имеет доступа к настройкам ПРОЕКТА А. Поэтому в ПРОЕКТЕ A мне нужно получить доступ к настройкам ПРОЕКТА B и сохранить его там. Так что, когда "Повтор" включен, агент возобновляет воспроизведение.

ПРОБЛЕМА

Я не могу сохранить настройки (другими словами, настройки сохраняются, но это не оказывает никакого влияния) во время работы экземпляра BackgroundAudioPlayer. Я всегда должен закрывать экземпляр, и когда я это делаю, настройки могут быть изменены.

ВОПРОС

  1. Какой самый эффективный способ сделать то, что я пытаюсь сделать?

  2. Как я могу сохранить настройки в IsolatedStorage, не закрывая экземпляр BackgroundAudioPlayer? (поскольку я не хочу прерывать ни одну из воспроизводимых дорожек).

КОД: Что я должен сделать, чтобы сохранить настройки.

    public bool SettingAudioRepeat
    {
        get
        {
            return GetValueOrDefault<bool>(SettingAudioRepeatKeyName, SettingAudioRepeatDefault);
        }
        set
        {
            if (AddOrUpdateValue(SettingAudioRepeatKeyName, value))
            {
                bool resumePlay = false;

                try
                {
                    if (BackgroundAudioPlayer.Instance.PlayerState != PlayState.Shutdown)
                    {

                        BackgroundAudioPlayer.Instance.Close();
                        resumePlay = true;
                    }
                }
                catch { }
                TaskEx.Delay(300);
                IQR_Settings iqrSet = new IQR_Settings();
                iqrSet.SettingAudioRepeat = value;
                iqrSet.Save(); //Saving the settings for Project B

                Save(); //Saving the settings for Project A

                try
                {
                    if (resumePlay)
                        BackgroundAudioPlayer.Instance.Play(); //It starts all from scracth

                }
                catch { }

            }
        }


    public T GetValueOrDefault<T>(string Key, T defaultValue)
    {

        T value;

        // If the key exists, retrieve the value.
        if (settings.Contains(Key))
        {
            value = (T)settings[Key];
        }
        // Otherwise, use the default value.
        else
        {
            value = defaultValue;
        }
        return value;
    }

КОД: То, что я просто хочу сделать.

    public bool SettingAudioRepeat
    {
        get
        {
            return GetValueOrDefault<bool>(SettingAudioRepeatKeyName, SettingAudioRepeatDefault);
        }
        set
        {
            if (AddOrUpdateValue(SettingAudioRepeatKeyName, value))
            {

                IQR_Settings iqrSet = new IQR_Settings();
                iqrSet.SettingAudioRepeat = value;
                iqrSet.Save(); //Saving the settings for Project B

                Save(); //Saving the settings for Project A


            }
        }

1 ответ

Решение

Я согласен, что Background Audio - это грудь. При использовании любого фонового агента вы не можете полагаться на синхронизацию с ApplicationSettings. Если вы хотите сохранить настройки и получить к ним доступ из пользовательского интерфейса (приложение) и фона (аудиоагент), вам следует сохранить файл. Вы можете сериализовать настройки с помощью Json.Net и сохранить файл в известном месте. Вот пример того, что может выглядеть

// From background agent
var settings = Settings.Load();
if(settings.Foo)
{
    // do something
}

А вот пример файла настроек. Настройки должны быть сохранены на регулярной основе.

public class Settings
{
    private const string FileName = "shared/settings.json";

    private Settings() { }

    public bool Foo { get; set; }

    public int Bar { get; set; }

    public static Settings Load()
    {
        var storage = IsolatedStorageFile.GetUserStoreForApplication();
        if (storage.FileExists(FileName) == false) return new Settings();

        using (var stream = storage.OpenFile(FileName, FileMode.Open, FileAccess.Read))
        {
            using (var reader = new StreamReader(stream))
            {
                string json = reader.ReadToEnd();
                if (string.IsNullOrEmpty(json) == false)
                {
                    return JsonConvert.DeserializeObject<Settings>(json);
                }
            }
        }
        return new Settings();
    }

    public void Save()
    {
        var storage = IsolatedStorageFile.GetUserStoreForApplication();
        if(storage.FileExists(FileName)) storage.DeleteFile(FileName);
        using (var fileStream = storage.CreateFile(FileName))
        {
            //Write the data
            using (var isoFileWriter = new StreamWriter(fileStream))
            {
                var json = JsonConvert.SerializeObject(this);
                isoFileWriter.WriteLine(json);
            }
        }
    }
}

У меня лично есть класс FileStorage, который я использую для сохранения / загрузки данных. Я использую это везде. Вот оно (и оно использует Mutex для предотвращения доступа к файлу как из фонового агента, так и из приложения). Вы можете найти класс FileStorage здесь.

Другие вопросы по тегам