2

我正在使用 IsolatedStorage 与音频代理进行通信,如下所示:

在我的每个页面中:

 private void playButton_Click(object sender, RoutedEventArgs e)
    {

        if (PlayState.Playing == BackgroundAudioPlayer.Instance.PlayerState)
        {
            BackgroundAudioPlayer.Instance.Pause();
        }
        else
        {
            IsolatedStorageSettings.ApplicationSettings["BtnClicked"] = "1"; (or 2 or 3)

            IsolatedStorageSettings.ApplicationSettings.Save();
            BackgroundAudioPlayer.Instance.Stop();
            BackgroundAudioPlayer.Instance.Play();

        }
    }

在我的 AudioPlayer.cs 中:

`case UserAction.Play:

    if ((string)IsolatedStorageSettings.ApplicationSettings["BtnClicked"] == "1")
    {
        _playList = _playList1;
    }

    else if ((string)IsolatedStorageSettings.ApplicationSettings["BtnClicked"] == "2")
    {

        _playList = _playList;
    }

    else if ((string)IsolatedStorageSettings.ApplicationSettings["BtnClicked"] == "3")
    {
        _playList = _playList2;            
    }
        PlayTrack(player);        `

然而,问题是“_playlist”变量除了第一次之外没有被更新。例如,如果我打开第 1 页,它会正确选择 _playlist1,但如果我按“返回”然后进入第 2 页,它仍然会选择 _Playlist1。每次在我的应用程序中选择新页面时,如何强制更新变量?其余代码也非常类似于:http: //msdn.microsoft.com/en-us/library/windowsphone/develop/hh202978%28v=vs.105%29.aspx

4

2 回答 2

1

MSDN 有一些关于后台代理最佳实践的指南:

http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202944(v=vs.105).aspx#BKMK_CommunicationBetweenForegroundApplicationandBackgroundAgent

值得注意的是,MSDN 建议不要使用 IsolatedStorageSettings 在前台应用程序和后台代理之间进行通信。相反,您应该使用 SQL 表或受互斥锁保护的隔离存储中的文件。

于 2014-01-13T14:39:48.803 回答
0

它没有更新,因为 IsolatedStorageSettings.ApplicationSettings 值缓存在静态变量中,并且无法强制它从隔离存储重新加载。

相反,您应该读/写一个由命名互斥锁保护的隔离存储文件。

顺便说一句,最好将该代码与文件+互斥锁名称一起放在 GUI 和后台进程之间共享的程序集中:这样您就可以确保您的两个进程都将使用相同的数据和相同的互斥锁。

PS不幸的是,命名互斥锁是平台上唯一可用的进程间同步方法:没有信号量,没有事件,没有windows消息,没有silverlight的本地消息,什么都没有。

于 2014-01-14T21:24:50.677 回答