编辑:转到第二次更新,以便最简单地重现这种奇怪的行为。
我正在尝试使用WindowsMediaPlayer库播放和停止声音。
我在互联网上搜索了几十页,所有人都说基本游戏需要相同的代码。
但它对我毫无用处。
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.URL = path; // relative path, absolute path, mp3 file, wav file.. I've tried everything
wplayer.controls.play();
我无法让它播放任何声音。
此外,如果我检查currentMedia属性,它会正确识别我的文件,
但声称其持续时间为0:00。
为什么会这样?
更新
我发现问题的答案是Application.Run()
我使用了WinForms项目,但删除了Form和Application.Run行。 (我的所有代码都在主要内容中)
事实证明必须有一个消息循环才能使用(顺便说一句SoundPlayer
类是不正确的)
另外(可能是出于同样的原因),在调试模式下,当从一行到另一行时,我听不到任何声音,直到GUI线程被释放。
我仍然非常好奇地理解为什么会这样?
为什么WMP需要消息循环?为什么SoundPlayer不是?
或者我错过了理解?
更新2:
如何重现?
新项目 - > Winforms - >删除Form1 - >转到program.cs
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
TryPlay(); // Do nothing.
while (true) { }
}
static void TryPlay()
{
string path = @"001_The Beatles - Help.wav";
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.MediaError += wplayer_MediaError;
wplayer.URL = path;
wplayer.controls.play();
}
static void wplayer_MediaError(object pMediaObject)
{
MessageBox.Show("ERROR");
}
}
但如果我们更改Main:
static void Main()
{
//TryPlay();
new Thread(() => TryPlay()).Start(); // WORKS(!)
while (true) { }
}
另一个选择是保持Main这样:
static void Main()
{
TryPlay();
while (true) { }
}
但更改TryPlay方法:
static void TryPlay()
{
string path = @"001_The Beatles - Help.wav";
WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();
wplayer.MediaError += wplayer_MediaError;
wplayer.URL = path;
wplayer.controls.play();
Application.Run(); // <------ WORKS. (why?)
}