C# 停止播放线程中的音乐

C# 停止播放线程中的音乐,c#,multithreading,audio,C#,Multithreading,Audio,我试图使多个音频文件同时播放,所以我决定使用线程来触发它们(否则,只有在上一个音频文件完成后才能开始播放) 我就是这样做的 声音是声音播放器的列表 for (int i = 0; i < sometimes; i++) { SoundPlayer sp = sounds[i]; Thread thread = new Thread(() => { sp.PlayLooping(); }); threads.Add(thread)

我试图使多个音频文件同时播放,所以我决定使用线程来触发它们(否则,只有在上一个音频文件完成后才能开始播放)

我就是这样做的

声音是声音播放器的列表

for (int i = 0; i < sometimes; i++)
{
    SoundPlayer sp = sounds[i];
    Thread thread = new Thread(() =>
    {
        sp.PlayLooping();
    });
    threads.Add(thread);
 }
 foreach (Thread thread in threads)
 {
     thread.Start();
 } 
我从中获得了kill_线程方法。 当messagebox弹出消息时,目标线程已经以这种方式被终止。然而,音乐仍在继续播放

有没有办法停止音乐?
提前谢谢

这是因为PlayLooping()方法本身启动了一个新线程,因此终止线程不会停止播放器线程


你不应该杀死任何线程,不管是你的线程还是其他线程。事实上,您甚至不应该创建线程。正如其他人所说,如果必须结束线程,请优雅地结束它,不要通过
中止
对其进行核爆。它可能使您的进程处于未知状态

只要打电话:

soundPlayer.Stop();
MSDN:

SoundPlayer.PlayLooping方法

.wav将一直播放,直到调用Stop方法为止

至于并发播放,
SoundPlayer
并不是为精心设计的并发播放而设计的(事实上它甚至不会这样做)。为此,您需要使用不同的媒体API

另见
  • Microsoft DirectShow(从90年代开始出现;坚如磐石;是媒体服务器和媒体中心的一部分;COM API;虽然没有管理,但COM很容易从.NET调用)

  • <> >媒体基础(新的区块儿童,没有托管API)


sp.Stop()
可能有用吗?@BWA我想了想。但我很感兴趣的是,为什么音频文件的线程被终止后仍在播放。可能是SoundPlayer创建了自己的线程?…使用新线程播放并循环.wav文件,如果未加载,则首先加载.wav文件。。。我只是想说。我通常不支持教条,但
Thread.Abort()
是邪恶的。请阅读我对这个问题的描述。创建线程是同时播放多个音乐,而不是“播放一个音乐”@jiecewei还有你的标题明确地说“停止播放线程中的音乐”和你的身体“有没有办法停止音乐?”我已经介绍过了,而不是“同时播放多个音乐”
SoundPlayer
不是为精心设计的并发播放而设计的。为此,您需要使用不同的媒体API。请随便问一个新问题是的,我发现了这个问题。我听不到音频文件同时播放,只有最后一个。我会考虑一个新的API
soundPlayer.Stop();