C#设置持续时间并连续播放存储在arraylist中的声音

C#设置持续时间并连续播放存储在arraylist中的声音,c#,arraylist,C#,Arraylist,我使用以下播放方法播放存储在arraylist中的音符: public void Play(Duration d){ int duration = 1; if (d == Duration.SemiBreve) { duration = 16; } else if (d == Duration.DotMin) {

我使用以下播放方法播放存储在arraylist中的音符:

public void Play(Duration d){


            int duration = 1;

            if (d == Duration.SemiBreve)
            {
                duration = 16;
            }

            else if (d == Duration.DotMin)
            {
                duration = 10;
            }

            else if (d == Duration.minim)
            {
                duration = 8;
            }

            else if (d == Duration.Crotchet)
            {
                duration = 4;
            }

            else if (d == Duration.Quaver)
            {
                duration = 2;
            }

            else if (d == Duration.SemiQuaver)
            {
                duration = 1;
            }

            player = new SoundPlayer();

            player.SoundLocation = "pathToLocation";


            //set timer
            time = new Timer();
            time.Tick += new EventHandler(clockTick);
            time.Interval = duration * 150;
            player.Play();
            time.Start();

        }
当我使用按钮调用该方法时:

private void PlayButton_Click(object sender, EventArgs e)

{

        //Loops through the collection and plays each note one after the other
        foreach (MusicNote music in this.staff.Notes)
        {
            music.Play(music.Dur)

        }
    }
只播放最后一个音符。使用PlaySync()可以播放所有音符,但无法识别持续时间。我还尝试使用如下线程:

foreach (MusicNote music in this.staff.Notes)
            {
                Thread t = new Thread(playMethod=>music.Play(music.Dur));  
                t.Start();
                t.Join();

            }

但它也不起作用。关于如何让文件像PlaySync一样连续播放,但使用设置的持续时间,有什么建议吗?

您不必在任何地方等待计时器。因此,在实践中,所有音符几乎同时播放,从而使最后一个音符可以有效地听到


更新:使用
System.Timers.Timer
类,方法是注册
appeased
事件的处理程序,并在事件处理程序中逐个播放注释。这样可以避免冻结UI

另一个选项是在后台线程中播放,并使用
线程.Sleep
等待。在这里,您必须确保根据UI的状态停止线程(即,用户关闭当前对话框等)


在任何一种情况下,为了避免竞争条件,您必须解决对
staff.Notes
的并发访问问题,或者制作一份副本以便播放。

您必须添加一些逻辑,以便一次播放一个音符。试着让它工作,这样它在点击按钮后只播放一个音符。然后添加计时器。所以我猜我必须在按钮方法中等待计时器,而不是音乐。播放方法?如何等待计时器,所以使用timer.appeased?谢谢,如果问题很简单,请原谅,但是我以前从来没有使用过timer类,而且我一直在研究,因为我设法用一种非常简单的方法解决了它,我将主线程设置为睡眠时间与每个音符的计时器间隔时间相同(直到声音播放完毕)。这适合我的特殊需要,但是由于整个程序都被阻塞了,你能建议一个更好的方法吗?不管怎样,你的回答让我找到了解决办法,谢谢。