如何让程序在两个定时动作之间等待

时间:2013-08-25 21:17:36

标签: c# windows-phone-8

我正在尝试为Windows Phone 8开发一个简单的SimonSays应用程序。

为了使序列对用户可见,我使用的是一个填充了键索引的数组(tasti),以及一个检查数组并使按钮变暗的for循环。

我写了这段代码:

   int livello = 1;
   double opac = 0.3;
    void IniziaGioco()
    {
        DispatcherTimer timer5 = new DispatcherTimer();
        timer5.Interval = new TimeSpan(0, 0, 0, 1);
        timer5.Start();
        for (int i = 0; i < livello; i++)
        {
            switch (tasti[i])
            {
                case 1:
                    DispatcherTimer timer = new DispatcherTimer();
                    timer.Interval = new TimeSpan(0, 0, 0, 0, 300);
                    timer.Tick += new EventHandler(DiventaOpaco1);
                    Button1.Opacity = opac;
                    SuonoBottone1.Play();
                    timer.Start();
                    timer5.Start();
                    break;
                case 2:
                    DispatcherTimer timer2 = new DispatcherTimer();
                    timer2.Interval = new TimeSpan(0, 0, 0, 0, 300);
                    timer2.Tick += new EventHandler(DiventaOpaco2);
                    Button2.Opacity = opac;
                    SuonoBottone2.Play();
                    timer2.Start();
                    timer5.Start();
                    break;
                case 3:
                    DispatcherTimer timer3 = new DispatcherTimer();
                    timer3.Interval = new TimeSpan(0, 0, 0, 0, 300);
                    timer3.Tick += new EventHandler(DiventaOpaco3);
                    Button3.Opacity = opac;
                    SuonoBottone3.Play();
                    timer3.Start();
                    timer5.Start();
                    break;
                case 4:
                    DispatcherTimer timer4 = new DispatcherTimer();
                    timer4.Interval = new TimeSpan(0, 0, 0, 0, 300);
                    timer4.Tick += new EventHandler(DiventaOpaco4);
                    Button4.Opacity = opac;
                    SuonoBottone4.Play();
                    timer4.Start();
                    timer5.Start();
                    break;
            }
        }

timer1 timer2 timer3timer4正常工作,并以正确方式调暗按钮。

我想使用timer5以使我的代码“等待”1秒钟,然后调暗下一个按钮,但它不起作用,因为按钮同时变暗。

计时器是最好的方法吗?如何使我的代码工作?

3 个答案:

答案 0 :(得分:1)

您可以使用AutoResetEvent.WaitOne(int)而不是使用计时器。我引用AutoResetEvent.WaitOne()方法的这个重载 - http://msdn.microsoft.com/en-us/library/cc189907.aspx。如果您从未提供Set()事件,则计时器将用完并执行下一行代码。

答案 1 :(得分:1)

您可以使用计时器来实现此目的。但IMO最佳解决方案是async/await以及Task.delay

for (int i = 0; i < livello; i++)
{
   // Your switch case
    await Task.Delay(1000);
}

按如下方式更改方法签名

async void IniziaGioco()

答案 2 :(得分:0)

您可以查看异步任务编程: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

Qoute: Visual Basic中的Async和Await关键字以及C#中的async和await关键字是异步编程的核心。通过使用这两个关键字,您可以使用.NET Framework或Windows运行时中的资源创建异步方法,就像创建同步方法一样简单。使用async和await定义的异步方法称为异步方法。

// you get somthing like this:
SuonoBottone1.Play();
await Task.Delay(1000);
SuonoBottone2.Play();
await Task.Delay(1000);
SuonoBottone3.Play();
await Task.Delay(1000);