【发布时间】:2021-04-12 03:29:28
【问题描述】:
这是一个更大的 WPF 项目的简化 sn-p 来说明问题。
当按下播放按钮时,此代码播放 mp3 的“1, 2, 3, 4, 5”然后停止。
当按下播放按钮时,调度计时器启动。在每个 Tick 上,都会调用 Metronome_Run 事件。 Metronome_Run 事件通过索引数组来分配要播放的 mp3。
问题是,第一次按 play 时效果很好,得到 1,2,3,4,5,但再次按 play 时得到 2,4,5,然后再次按 play,得到3,5!好像每次按某种方式按下播放时,文件的索引似乎都会发生偏移。
当调试器单步执行时,它每次都能完美运行,但没有设置任何断点(就像在构建中一样),它仅在第一次正常工作,并且在进一步按下播放按钮时无法正常工作。
感谢任何帮助!
public partial class MainWindow : Window
{
private MediaPlayer mediaPlayer = new MediaPlayer();
List<int> NoteValArray = new List<int>() { 1,2,3,4,5 };
private DispatcherTimer timer1;
int numVal = 0;
int numIndex = 0;
private float tempo = 35f;
public MainWindow()
{
InitializeComponent();
timer1 = new DispatcherTimer();
}
private void Metronome_Run(object sender, EventArgs e)
{
if (NoteValArray.Count > numIndex) // if we are not outside the list bounds
{
numVal = NoteValArray[numIndex]; // get the value at this list index and place it in numVal
numIndex ++; // increment
}
else { timer1.Stop(); return; }
// Load the mp3 indicated by numVal
if (numVal == 1) { mediaPlayer.Open(new Uri("1.mp3", UriKind.Relative)); }
else if (numVal == 2) { mediaPlayer.Open(new Uri("2.mp3", UriKind.Relative)); }
else if (numVal == 3) { mediaPlayer.Open(new Uri("3.mp3", UriKind.Relative)); }
else if (numVal == 4) { mediaPlayer.Open(new Uri("4.mp3", UriKind.Relative)); }
else if (numVal == 5) { mediaPlayer.Open(new Uri("5.mp3", UriKind.Relative)); }
mediaPlayer.Play(); // play whats loaded
}
private void Start_Button_Click(object sender, RoutedEventArgs e)
{
numIndex = 0;
timer1.Tick += Metronome_Run; // run this at each tick
timer1.Interval = TimeSpan.FromMilliseconds(10000 / (tempo / 6));
timer1.Start();
}
}
}
【问题讨论】: