2014-04-21 108 views
0

我需要一些帮助为Windows Media Player音频设置BackgroundWorker进程。我需要直接从BackgroundWorker运行音频(WMP),而不是从主线程运行,并且该后台进程需要保持打开状态直到音频文件结束,但即使音频在PLAY上开始播放正常,BackgroundWorker也会停止,因此我不认为音频实际上是在第二个线程或backgroundWorker上播放,因为它已经关闭了。Windows Media Player的BackgroundWorker进程

我的问题是,我如何使用Windows Media Player(WMPLib)从backgroundWorker播放该音频文件,该文件将保持打开状态直至歌曲结束?

using WMPLib; 

namespace mediaplayer 
{ 

    public partial class MainWindow : Window 
    { 

     BackgroundWorker m_audioProcessingWorker; 


     public MainWindow() 
     { 
      InitializeComponent();    
     } 
     string filename = @"C:\audio\song1.mp3" 


     private void button_play_Click(object sender, EventArgs e) 
     { 
      // Create the Audio Processing Worker (Thread) 
      m_audioProcessingWorker = new BackgroundWorker(); 
      m_audioProcessingWorker.DoWork += new DoWorkEventHandler(audioProcessingWorker_DoWork); 
      m_audioProcessingWorker.RunWorkerAsync(); 
      m_audioProcessingWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(audioProcessingWorker_Completed); 
     } 


     private void audioProcessingWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      try 
       { 
       axWindowsMediaPlayer1.URL = filename; 
       axWindowsMediaPlayer1.Ctlcontrols.play(); 
       } 
      catch (Exception ex) 
       { 
       MessageBox.Show(ex.Message); 
       } 

     } 

     private void audioProcessingWorker_Completed(object sender, RunWorkerCompletedEventArgs e) 
     { 
      MessageBox.Show("Audio is finished"); 

     } 


     private void button_stop_Click(object sender, EventArgs e) 
     { 

      axWindowsMediaPlayer1.Ctlcontrols.stop(); 
      m_audioProcessingWorker.CancelAsync(); 
     } 

     private void button_pause_Click(object sender, EventArgs e) 
     { 
      axWindowsMediaPlayer1.Ctlcontrols.pause(); 
     } 


    } 
} 

谢谢。

+0

你确定你需要一个BackgroundWorker吗? 'play'的文档只是简单地从UI线程调用它:http://msdn.microsoft.com/en-us/library/dd564746(v=vs.85).aspx这表明它是异步的。另外,如果它是一个activex控件,那么你不能简单地在另一个线程上使用它 - 你必须在新线程上初始化它 - 这不是真的推荐用于线程池线程。 –

+0

我有UI它会导致音频播放在同一个线程UI中加载大块数据时冻结或停顿,我宁愿让音频进程在单独的线程上运行,这也是为什么我通过BackgroundWorker。 @PeterRitchie – AJ152

+1

我不会推荐一个BackgroundWorker,你可能不得不手动创建线程(确保它是STA)并初始化该新线程中的ActiveX控件。做线程池线程(这是BackgroundWorker用户)的线程池会导致线程池出现问题,因为线程会被别的东西重复使用... –

回答

0

的UI我有它,从而导致音频回放加载数据的大块同一主题UI内部时,冻结或停止 ,我会 宁愿有一个单独的线程运行的音频过程中, 为什么我虽然BackgroundWorker

你还是使用BackgroundWorker(或更好,但Task.Run或自然异步IO API)来加载数据的大块大块的背景,并保持在主UI线程无滞后。然后在UI线程上创建并使用WMP控件。

如果你不能用这种方式重构代码,并且想要使用WPM的后台线程,请记住这样的线程必须泵送Windows消息,否则WPM控件可能无法正常工作。为此,您可以使用我的ThreadWithAffinityContexthere