我试图创建一个简单的应用程序来学习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();
}
答案 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();
}
}
}