c# - 停止在线程中播放音乐

标签 c# multithreading audio

我试图让多个音频文件同时播放,所以我决定使用线程来触发它们(否则只能开始播放直到前一个完成)。

我就是这样做的。

声音是 SoundPlayers 的列表

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

然后我使用计时器在 1 秒后停止所有音频文件。
foreach(Thread t in threads)
{
    kill_thread(t);
    MessageBox.Show(t.IsAlive.ToString());
}
[SecurityPermissionAttribute(SecurityAction.Demand, ControlThread = true)]
private void kill_thread(Thread t)
{
   t.Abort();
}

我从 here 获得 kill_thread 方法.
随着消息从消息框弹出,目标线程已经以这种方式被杀死。然而,音乐还在继续播放。

有什么方法可以停止音乐吗?
提前致谢!

最佳答案

你不应该杀人 任意 线程,你的或其他的。事实上,您甚至不应该创建线程。正如其他人所说,如果您必须结束一个线程,请优雅地结束它,不要通过 Abort 核对它.它会使您的进程处于未知状态。
只需调用:

soundPlayer.Stop();
MSDN:

SoundPlayer.PlayLooping Method

The .wav will be played until the Stop method is called. https://msdn.microsoft.com/en-US/library/system.media.soundplayer.playlooping(v=vs.110).aspx


至于并发播放,SoundPlayer不是为精细的并发播放而设计的(实际上它甚至不会这样做)。您需要为此使用不同的媒体 API。
也可以看看
  • Microsoft DirectShow(自 90 年代以来一直存在;坚如磐石;媒体服务器和媒体中心的一部分;COM API;虽然不受管理,但 COM 很容易从 .NET 调用)
  • 媒体基金会(新来的 child ;也没有托管 API)
  • 关于c# - 停止在线程中播放音乐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48665420/

    相关文章:

    c# - 模板抽象类在字典中有值

    c# - 如何在我自己的实用程序类中访问 TempData?或者构造函数中的 TempData 为 null

    python - gevent和线程之间的效率比较

    jquery - 同一页面上的Jplayer音频和视频不起作用

    java - 反向播放,java

    C# .rdlc Report Viewer 在打印时在右侧添加空白

    c# - 不再有动态、笨拙的反射?

    java - 在指定日期执行 Java Swing 操作

    android - 最佳实践 : Update ArrayAdapter continuously

    audio - Flutter-如何播放环境声音?