c# - C# 遍历列表

标签 c# list for-loop soundplayer piano

我正在使用一些 C#,并且正在编写一个钢琴应用程序。

每当用户单击钢琴音符时,我都会将声音 (.wav) 的位置存储到列表中...以下是 button1_MouseDown 方法中的一些代码。

if (e.Button == MouseButtons.Left)
   {
       SoundPlayer sp = new SoundPlayer();
       string musName = Convert.ToString(mk.pitch);
       string loc = @"D:\OneDrive\Year 2 Semester 1\OOP\Notes-Sound files\Notes-Sound files\mapped\" + musName + ".wav";
       sp.SoundLocation = loc;
       sp.Play();
       music.Add(loc);
    }

现在,我想遍历循环以一次性播放所有单击的键。我这样做如下(当用户单击播放按钮时)

int k = 0;
for (k = 1; k < music.Count; k++)
{
   SoundPlayer sp = new SoundPlayer();
   sp.SoundLocation = music[k];
   sp.Play();
 }

问题是,每当单击播放按钮时,只会播放最后按下的音符。但是,当我调试时,不知何故,所有音符都会播放。有什么想法吗?

最佳答案

根据MSDN ,这是 Play 方法的描述:

Plays the .wav file using a new thread, and loads the .wav file first if it has not been loaded.

因此,每当您调用 Play 时,它都会异步运行,并且您的循环会在当前 wav 文件完成之前继续执行播放下一个 wav 文件。当您调试时,您可能会在继续循环之前等待。

相反,请尝试使用 PlaySync同步播放声音

PS。另外,您可能需要考虑在列表中使用 SoundPlayer 的实例而不是文件名,以避免每次播放 wav 文件时创建新实例:

List<SoundPlayer> music = new List<SoundPlayer>();
//...

//In your first loop, you would add the SoundPlayer object
music.Add(sp);

//.. 
//Then when you're playing back:
for (int k = 0; k < music.Count; k++)
{
   music[k].PlaySync();
}

请注意,for 循环中的索引也应从 0 开始

关于c# - C# 遍历列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40884714/

相关文章:

c# - 将 mudblazor TreeView 绑定(bind)到对象

c# - 如何以编程方式将现有项目添加到项目中?

c# - 如何使用 String.Contain 函数使用其 ascii 字符来查找字符串是否具有回车符?

r - 根据 R 中的列表长度动态创建嵌套的 FOR 循环

c - 在C中初始化图时如何分配内存?

c# - 如何对附近坐标进行分组

c++ - 如何在 C++ 中获取列表?

c# - 聚合参数中的语法错误 : Expecting a single column argument with possible 'Child' qualifier

python - 为什么嵌套列表索引与列表推导式交换?

javascript - Chrome for 循环优化