0

我的解决方案中有两个项目。假设项目 A 和项目 B。

项目A

它是主要项目并具有设置。我有一个复选框,可以让用户选择“重复”曲目。该项目还可以访问 PROJECT B 的公共实例。

项目 B

它是 BackgroundAudioAgent 并且有它自己的设置。此项目无权访问 PROJECT A 设置。因此,在 PROJECT A 中,我需要访问 PROJECT B 的设置并将其保存在那里。这样,当启用“重复”时,代理会重新开始播放。

问题

当 BackgroundAudioPlayer 的实例正在运行时,我无法保存设置(换句话说,设置已保存,但不会产生任何影响)。我总是必须关闭实例,当我这样做时,可以更改设置。

问题

  1. 做我想做的事情的最有效方法是什么?

  2. 如何在不关闭 BackgroundAudioPlayer 实例的情况下将设置保存在 IsolatedStorage 中?(因为我不想打断正在播放的任何曲目)。

代码:我必须做些什么来保存设置。

    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;
    }

CODE:我只是想做的事。

    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


            }
        }
4

1 回答 1

3

我同意背景音频是一个乳房。每当使用任何后台代理时,您都不能依赖 ApplicationSettings 进行同步。如果您想从 UI(应用程序)和后台(音频代理)保存和访问设置,您应该保存一个文件。您可以使用 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类,用于保存/加载数据。我到处都用它。在这里(它确实使用互斥锁来防止后台代理和应用程序访问文件)。您可以在此处找到 FileStorage 类

于 2013-07-23T18:32:20.987 回答