我发现了一个奇怪的问题,我会尽量简短地解释它。
假设:
据我所知,当您为 AudioPlayerAgent 设置新的 AudioTrack 时,有两个任务排队:Stop() 和 TrackReady();。似乎合乎逻辑,并且在大多数情况下都可以完美运行。但是当我使用我的程序时,我发现有时它不是那么好:
问题:
所以我决定写一个非常简单的例子 - 你可以在这里得到它。只有一个按钮调用 BackgroundAudioPlayer.Instance.Play();。(您必须在该示例中仅添加 music.mp3 文件 - 例如 5-6 Mb mp3 文件)。在音频代理中,我有:
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
player.Track = myMusic.ReturnTrack();
break;
我在设备(WP8)上以调试模式运行程序并按下我的播放按钮。然后我看到在大多数情况下,Audio Agent 中的 OnPlayStateChanged 没有被触发,并且查看进程,我看到我有 Headless 'Zombie'。似乎陷入了僵局。(顺便说一句:在这个简单的例子中,我没有使用任何互斥锁或其他并发技术)奇怪(或者可能没有)Stop() 和 TrackReady 也在队列中等待 - 如果您触发任何其他调用 NotifyComplete() 的方法; 您会看到队列畅通无阻。
我试过没有调试的 Realese 版本,它工作得更好,但有时会发生同样的情况。
如果我只添加:
case UserAction.Play:
if (player.PlayerState != PlayState.Playing)
{
player.Track = myMusic.ReturnTrack();
Thread.Sleep(100);
}
break;
一切都好得多。
结论:
在我看来,加载新轨道是异步工作的,并且在加载轨道之前调用 NotifyComplete() - 是什么创建了这个“无头僵尸”过程。最糟糕的是,您在队列中等待操作的时间有限,用完后,您的代理将被杀死。
在我看来,它不应该那样工作,因为设置新轨道是主要功能之一。
有人知道这个问题吗?这是操作系统的错误或不当行为还是我缺乏知识?