コンテキスト:メディア要素を介して音楽を再生し、スライダーを使用して曲のポイントを表示しています。その更新は、明らかな理由で、バックグラウンドワーカーで行われます。
private void bgPlay_DoWork(object sender,DoWorkEventArgs e)
{
while (isMediaPlaying)
{
this.Dispatcher.Invoke((Action)(() =>
{
timelineSlider.Value = mediaElement1.Position.TotalMilliseconds;
}));
}
}
private void Library_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
try
{
mediaElement1.Stop();
isMediaPlaying = false;
mediaElement1.Source = new Uri(songData[Library.SelectedIndex].Location);
mediaElement1.Volume = (double)volumeSlider.Value;
mediaElement1.Play();
isMediaPlaying = true;
bgPlay.RunWorkerAsync();
}
catch(Exception ex) {
F.MessageBox.Show(ex.ToString());
}
}
曲を再生してから別の曲をダブルクリックすると、バックグラウンドワーカーはループを続けbgPlay.RunWorkerAsync();
、前のインスタンスが終了する前に到達したため、例外をスローします。isMediaPlaying boolを使用して、ループを終了するタイミングをbackgroundworkerに通知しようとしましたが、メインスレッドがbgPlay.RunWorkerAsync();
終了する前に到達します。