我需要一些帮助为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();
}
}
}
谢谢。
你确定你需要一个BackgroundWorker吗? 'play'的文档只是简单地从UI线程调用它:http://msdn.microsoft.com/en-us/library/dd564746(v=vs.85).aspx这表明它是异步的。另外,如果它是一个activex控件,那么你不能简单地在另一个线程上使用它 - 你必须在新线程上初始化它 - 这不是真的推荐用于线程池线程。 –
我有UI它会导致音频播放在同一个线程UI中加载大块数据时冻结或停顿,我宁愿让音频进程在单独的线程上运行,这也是为什么我通过BackgroundWorker。 @PeterRitchie – AJ152
我不会推荐一个BackgroundWorker,你可能不得不手动创建线程(确保它是STA)并初始化该新线程中的ActiveX控件。做线程池线程(这是BackgroundWorker用户)的线程池会导致线程池出现问题,因为线程会被别的东西重复使用... –