在循环c#中等待x秒

时间:2017-11-23 00:15:56

标签: c# visual-studio timer

我试图创建一个简单的应用程序来学习c#(Visual Studio)中的一些东西。 目前我正在构建一个音乐播放器,其中一个动作是在按钮点击事件中淡出音乐。

构建淡出部分我没有问题,我做了一个while循环,每次循环运行时将音量降低1%。我也用fade值更新标签。

唯一的问题是,为了减慢使用Thread.Sleep事件的淡入淡出,并且该部分冻结了我的应用程序,并且还使用淡入淡出值阻止对文本标签的任何更新。

褪色工作正常,所以我必须处理的唯一部分是构建延迟的另一个选项。在这里的一些主题我读到了关于计时器,我在Visual Studio中添加了一个计时器组件。唯一的问题是,我是c#的新手,并且不知道如何在这个while循环中正确使用它。

有人可以给我一些帮助吗?

目前的代码是:

    private void BtnPodiumtune1Fadeout_Click(object sender, EventArgs e)
    {
        PlayerPodiumtune1.settings.volume = 100;
        fade1 = 100;
        while (fade1 != -1)
        {
            PlayerPodiumtune1.settings.volume = fade1;
            Fadelevel1.Text = fade1.ToString();
            System.Threading.Thread.Sleep(30);
            fade1 = fade1 - 1;
        }
        PlayerPodiumtune1.Ctlcontrols.stop();
    }

2 个答案:

答案 0 :(得分:3)

你可以使用这样的模式而不是计时器。计时器是一个很好的方法,只需抛出这个选项:

private async void button_Click(object sender, EventArgs e)
{
  if (Monitor.TryEnter(sender))
  {
    int fade1 = 1000;
    while (fade1 != -1)
    {
      await Task.Delay(30);
      fade1--;
    }
  }
}

所以sender是按钮,Monitor.TryEnter阻止函数再次运行,直到函数完成。 async告诉框架该函数可以异步执行,对于await是必需的。 await将对线程的控制权返回给UI,直到任务完成。

PS - 顺便说一下,你还需要像Monitor.TryEnter这样的东西来防止基于计时器的解决方案的重新入侵。

答案 1 :(得分:-1)

这是C#中的控制台应用程序:

using System;

namespace WaitAsync
{
    class Program
    {

        static void Main(string[] args)
        {
            bool ok = false;

            Console.Write("EnterTime (Seconds): ");
            int time = Convert.ToInt32(Console.ReadLine()) * 1000;

            while (ok != true)
            {
                System.Threading.Thread.Sleep(time);
                ok = true;
                Console.WriteLine("Waiting Time Just Finished");
            }
            Console.ReadLine();
        }
    }
}