首页 > 解决方案 > 如何在 C# 控制台应用程序中使用音效?

问题描述

我在 C# 控制台应用程序中做这个小型 RPG 游戏,我想在选择菜单选项时添加一些背景音乐和效果。

我注意到当背景音乐开始播放时我什么也做不了。我想到了线程,但这对我来说是全新的(6 周前开始学习 C#)。

我设法做的是开始一个新线程并播放声音

static Thread backgroundMusic = new Thread(() =>
    {

        using (var audioFile = new AudioFileReader(AppDomain.CurrentDomain.BaseDirectory + "\\menu.mp3"))
        using (var outputDevice = new WaveOutEvent())
        {
            backgroundMusic.IsBackground = true;
            outputDevice.Init(audioFile);
            outputDevice.Play();
            while (true)
            {
                Thread.Sleep(1);
            }

        }
    });

然后我做的声音效果...

static Thread click = new Thread(() =>
    {

        using (var audioFile = new AudioFileReader(AppDomain.CurrentDomain.BaseDirectory + "\\click.mp3"))
        using (var outputDevice = new WaveOutEvent())
        {
            click.IsBackground = true;
            outputDevice.Init(audioFile);
            outputDevice.Play();
            while (true)
            {
                Thread.Sleep(1);
            }
        }
    });

我从 click.Start(); 开始。背景音乐.Start();

好的,到目前为止一切都很好。它播放背景音乐和播放音效,但只有一次。Can I reuse the thread in some way to play the click sound again when another option is chosen? 我可以以某种方式中止声音吗?当你玩游戏和菜单时,我可能想要不同的音乐。

试过 backgroundMusic.Abort(); 但后来我得到了这个:

System.PlatformNotSupportedException: 'Thread abort is not supported on this platform.'

一旦我启动了一次线程,我就无法重新启动它。我试过 backgroundMusic.Start();

我一直在查看论坛,但似乎都涵盖了 Windows 窗体,并且没有使用控制台应用程序。

https://docs.microsoft.com/en-us/dotnet/api/system.threading.thread?view=net-5.0 我也检查了文档......但老实说,我认为微软的文档不是给菜鸟的。我觉得很难理解。

我可能一直做错了,所以不要对我太苛刻,但请提出如何改进的建议。

所以我想要: 播放和循环播放背景音乐 每次选择菜单选项时单击声音

我有:背景音乐播放一次(直到文件末尾)单击第一个菜单选项上的声音,然后引发异常(见上文)

标签: c#multithreading

解决方案


你永远不应该使用Thread.Abort(). 它只是以一种“邪恶”的方式停止线程——通过抛出异常,你永远不知道会有什么副作用。

你需要CancellationToken. 查看这篇文章:https ://docs.microsoft.com/en-us/dotnet/standard/threading/cancellation-in-managed-threads


推荐阅读