2013-01-22 30 views
0

背景:我通過媒體元素播放音樂,並使用滑塊顯示歌曲中的點。這個更新是由後臺工作人員完成的,原因很明顯。確保背景工作者在再次運行之前已完成

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();

回答

0

你痛苦時,一個幾乎沒有開始線程編程一個常見的錯誤,一個race condition

我建議改寫這樣的代碼:

private static String threadingLock = ""; 

private void bgPlay_DoWork(object sender,DoWorkEventArgs e) 
    { 

     while (true) 
     { 
      lock(threadingLock) { 
       if(!isMediaPlaying) 
        break; 
      } 
      this.Dispatcher.Invoke((Action)(() => 
      { 
       timelineSlider.Value = mediaElement1.Position.TotalMilliseconds; 
      })); 

     } 
    } 

    private void Library_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     try 
     { 
      lock(threadingLock) { 
       isMediaPlaying = false; 
      } 
      mediaElement1.Stop(); 

      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()); 
     } 
    } 

作爲友好尖,加在調用滑塊上的更新之前調用Thread.sleep(200)。它會減少CPU使用率,而不會影響應用程序的功能。

+0

非常全面的答案。謝謝! – Wilson

相關問題