C# 在不锁定GUI的情况下播放wav文件之间添加时间间隔

C# 在不锁定GUI的情况下播放wav文件之间添加时间间隔,c#,silverlight,timer,C#,Silverlight,Timer,我在这件事上完全被难住了。我正在为我正在Silverlight中使用C#(请不要使用VB.NET)制作的应用程序创建“点击轨迹”。我在页面上有一个滑块,我想表示点击之间的时间间隔。也就是说,我希望我的代码看起来像这样: int i = 0; while(i < 1) { using (var stream = TitleContainer.OpenStream("click.wav")) { var effect = SoundEffect.FromStr

我在这件事上完全被难住了。我正在为我正在Silverlight中使用C#(请不要使用VB.NET)制作的应用程序创建“点击轨迹”。我在页面上有一个滑块,我想表示点击之间的时间间隔。也就是说,我希望我的代码看起来像这样:

int i = 0;

while(i < 1)
{
    using (var stream = TitleContainer.OpenStream("click.wav"))
    {
        var effect = SoundEffect.FromStream(stream);
        FrameworkDispatcher.Update();
        effect.Play();
    }       
    ClickInterval(clickSlider.Value);
    i++;    
}
inti=0;
而(i<1)
{
使用(var stream=TitleContainer.OpenStream(“click.wav”))
{
var效应=声音效应。来自流(流);
FrameworkDispatcher.Update();
效果。游戏();
}       
ClickInterval(clickSlider.Value);
i++;
}

ClickInterval()表示单击之间时间间隔的方法。我不知道如何创建这个间隔。计时器只是锁定GUI,我不确定线程是否是一种方式,因为这可能会创建太多线程(我不确定这是否会是一个问题)。也许甚至上面的代码也可以重写。关于这件事有什么想法吗?任何建议都会大有帮助

我最初的想法行不通,但这可能:

int i = 0;
string[] songs = new string[] { "click.wav" };
Timer timer = new Timer(){ Interval = clickSlider.Value * 1000 }; // 1000 = 1 second
EventHandler handler = (s,e) => 
{ 
    timer.Stop(); 
    PlayNext(songs, i++); 
    if(i < songs.Length)
        timer.Start(); 
};
timer.Tick += handler;

handler(null,null); // starts timer and plays first song.

任何与GUI在同一线程中的
睡眠
,都会将其锁定。您需要使用另一个线程或
BackgroundWorker
来播放单击

您的线程将包含与上面类似的代码:

var stream = TitleContainer.OpenStream("click.wav")
var effect = SoundEffect.FromStream(stream);

while(true)
{
    FrameworkDispatcher.Update();
    effect.Play();     
    ClickInterval(clickSlider.Value);    
}
如您所见,这将在后台连续运行,直到您停止线程。(如果您在GUI上有一个“停止单击”按钮,您可以设置一个变量,该变量将打破while循环。)我还显示了
效果
,因此线程不会继续创建和销毁它们


ClickInterval
基本上应该调用
Thread.Sleep(clickSlider.Value)
如果传递的值以毫秒为单位。

Thread.Sleep锁定窗口-这也是我的第一个想法。OP明确地说,不要锁定GUI。@Chuck:如果您在GUI线程以外的线程上执行此操作,则不会。这就是为什么你从来没有在GUI线程上这样做过。谢谢你的帮助。我能够解决这个问题:private void TestMetronome(object sender,RoutedEventArgs e){System.Windows.Threading.DispatcherTimer myDispatcherTimer=new System.Windows.Threading.DispatcherTimer();myDispatcherTimer.Interval=new TimeSpan(0,0,0,1000);//1000毫秒(1秒)myDispatcherTimer.Tick+=new EventHandler(每个Tick);myDispatcherTimer.Start();}public void每个Tick(对象o,EventArgs sender){使用(var stream=TitleContainer.OpenStream(“click.wav”){var effect=SoundEffect.FromStream(stream);FrameworkDispatcher.Update();effect.Play();}
var stream = TitleContainer.OpenStream("click.wav")
var effect = SoundEffect.FromStream(stream);

while(true)
{
    FrameworkDispatcher.Update();
    effect.Play();     
    ClickInterval(clickSlider.Value);    
}