C# UWP MediaPlayer意外重放音乐
我很抱歉,我想让你们帮我调试,但我真的不知道出了什么问题 这是一段无法按预期工作的代码:C# UWP MediaPlayer意外重放音乐,c#,uwp,win-universal-app,C#,Uwp,Win Universal App,我很抱歉,我想让你们帮我调试,但我真的不知道出了什么问题 这是一段无法按预期工作的代码: public static async Task SetPlaylist(ICollection<Music> playlist, Music music = null) { int index = 0; if (CurrentPlaylist.Count > 0) { if (music == nul
public static async Task SetPlaylist(ICollection<Music> playlist, Music music = null)
{
int index = 0;
if (CurrentPlaylist.Count > 0)
{
if (music == null)
{
CurrentPlaylist.Clear();
PlayBackList.Items.Clear();
}
else
{
Debug.WriteLine(music.Name);
foreach (var item in CurrentPlaylist.ToArray())
{
if (item.Equals(music)) index = 1;
else RemoveMusic(item);
}
Debug.WriteLine(new string('=', 20));
}
}
foreach (var item in playlist.Skip(index))
await AddMusic(item);
if (!CurrentPlaylist.Contains(CurrentMusic))
CurrentMusic = null;
}
public static async Task SetPlaylist(ICollection playlist,Music Music=null)
{
int指数=0;
如果(CurrentPlaylist.Count>0)
{
如果(音乐==null)
{
CurrentPlaylist.Clear();
PlayBackList.Items.Clear();
}
其他的
{
Debug.WriteLine(music.Name);
foreach(CurrentPlaylist.ToArray()中的变量项)
{
如果(项目等于(音乐))索引=1;
音乐(项目);
}
WriteLine(新字符串('=',20));
}
}
foreach(播放列表中的变量项。跳过(索引))
等待添加音乐(项目);
如果(!CurrentPlaylist.Contains(CurrentMusic))
CurrentMusic=null;
}
此功能的作用是重置播放列表,如果指定了音乐,则不要从播放列表中删除该音乐。当您仍在播放音乐时,将音乐播放器设置为随机播放模式时,此功能非常有用。它只会洗牌播放列表的其余部分,而不会中断当前播放
问题是,如果我在第一个foreach
上设置一个断点,并一步一步地运行foreach
,那么它运行得非常完美,没有任何错误。但是,如果在第一个foreach
中按continue,则当前播放的音乐将停止并重新启动,这意味着当前播放的音乐可能会被删除并重新添加到播放列表中
我不知道如何调试它。我只能猜测它可能和async
有关。它还提供了正确的输出,即使它的行为不符合预期
我的源代码在这里:。我测试了您的代码,在
SetPlaylist(ICollection playlist,Music Music=null)
方法中发现了问题,这可能是频繁的删除和添加操作造成的,并且发生了冲突。因此,我尝试通过更新数组中的元素进行测试,发现它是有效的,因此您可以使用下面的代码进行测试
public static async Task SetPlaylist(ICollection<Music> playlist, Music music = null)
{
int index = 0;
foreach (var item in playlist.Skip(1))
{
index++;
await FayAddMusic(item, index);
}
if (!CurrentPlaylist.Contains(CurrentMusic))
CurrentMusic = null;
}
public static async Task FayAddMusic(Music music, int index)
{
try
{
var file = await StorageFile.GetFileFromPathAsync(music.Path);
var source = MediaSource.CreateFromStorageFile(file);
music.IsPlaying = false;
source.CustomProperties.Add("Source", music);
var item = new MediaPlaybackItem(source);
// update element
PlayBackList.Items[index] = item;
CurrentPlaylist[index] = music;
}
catch (System.IO.FileNotFoundException)
{
}
}
public static async Task SetPlaylist(ICollection playlist,Music Music=null)
{
int指数=0;
foreach(播放列表中的变量项。跳过(1))
{
索引++;
等待FayAddMusic(项目、索引);
}
如果(!CurrentPlaylist.Contains(CurrentMusic))
CurrentMusic=null;
}
公共静态异步任务FayAddMusic(音乐,int索引)
{
尝试
{
var file=await-StorageFile.getfilefrompathsync(music.Path);
var source=MediaSource.CreateFromStorageFile(文件);
music.isplay=false;
source.CustomProperties.Add(“source”,音乐);
var项=新的MediaPlaybackItem(源);
//更新元素
播放列表。项目[索引]=项目;
当前播放列表[索引]=音乐;
}
捕获(System.IO.FileNotFoundException)
{
}
}
多亏了@Faywang-MSFT,我才知道它重放的原因。虽然他提供的解决方案似乎对我不好,但我非常感谢他的帮助,所以我接受了他的回答
这里我只想给出我的解决方案
首先,我创建了另一个MediaPlaybackList
(我称之为PendingPlaybackList
)来放置新的无序播放列表。我给它赋值为null
然后,我没有将所有内容都放入SetPlaylist
,而是启动了一个名为ShuffleOthers
的新函数来执行我想要的操作:
public static async Task SetPlaylist(ICollection<Music> playlist)
{
if (CurrentPlaylist.Count > 0) Clear();
foreach (var item in playlist)
await AddMusic(item);
if (!CurrentPlaylist.Contains(CurrentMusic))
CurrentMusic = null;
}
public static async void ShuffleOthers()
{
PendingPlaybackList = new MediaPlaybackList();
var playlist = ShufflePlaylist(CurrentPlaylist, CurrentMusic);
CurrentPlaylist.Clear();
foreach (var item in playlist)
await AddMusic(item);
CurrentPlaylist[0].IsPlaying = true;
}
如果我的答案令人困惑,那么我的源代码就是。欢迎您留下任何评论。所以您的问题是,如果设置洗牌模式,播放机将被中断,对吗?是的。@NicoZhu MSFTI检查方法,当您设置
shuffle
模式时,PlayBackList.Items.Clear()代码>会很清楚的。真的吗?我从来没有提到过@NicoZhu MSFT这个部分,我在foreach
中也没有。请检查这个ShuffleAndPlay
方法。谢谢!我还没有机会尝试它,因为今天对我来说仍然是假日,但是如果你想播放新的播放列表,你怎么能不删除它呢?这并不意味着我没有删除它,我只是将(删除和添加)的步骤转化为更新。这意味着将当前播放列表或播放列表中的每个项目更新为与新列表对应的项目,如PlayBackList.Items[index]=item代码>如果你只是更新它,我认为当前播放的项目将在它仍在播放时更改。
public static MediaPlaybackList PlaybackList
{
get
{
if (PendingPlaybackList != null)
{
if (PendingPlaybackList.Items.Count < _PlaybackList.Items.Count)
return PendingPlaybackList;
_PlaybackList.Items.Clear();
foreach (var item in PendingPlaybackList.Items)
_PlaybackList.Items.Add(item);
PendingPlaybackList = null;
_PlaybackList.MoveTo(0);
}
return _PlaybackList;
}
}