当BackgroundAudioPlayer';的实例处于活动状态

本文关键字:实例 活动状态 BackgroundAudioPlayer | 更新日期: 2023-09-27 18:24:05

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

项目A

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

项目B

它是BackgroundAudioAgent,有自己的设置。此项目无权访问项目A设置。因此,在项目A中,我需要访问项目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;
    }

代码:我只是想做什么。

    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

            }
        }

当BackgroundAudioPlayer';的实例处于活动状态

我同意背景音频是一个乳房。无论何时使用任何后台代理,都不能依赖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类,用于保存/加载数据。我到处都用它。它就在这里(它确实使用Mutex来阻止后台代理和应用程序访问该文件)。您可以在此处找到FileStorage类。