c# - 杀死或检测动态秒表?
问题描述
我有一个动态表单,在运行时生成了不同的标签,当检测到关键的东西时,我将标签设置为通过以下方式闪烁:
SoftBlink(label, Color.FromArgb(30, 30, 30), Color.Red, 2000, true);
private async void SoftBlink(Control ctrl, Color c1, Color c2, short CycleTime_ms, bool BkClr)
{
var sw = new Stopwatch(); sw.Start();
short halfCycle = (short)Math.Round(CycleTime_ms * 0.5);
while (true)
{
await Task.Delay(1);
var n = sw.ElapsedMilliseconds % CycleTime_ms;
var per = (double)Math.Abs(n - halfCycle) / halfCycle;
var red = (short)Math.Round((c2.R - c1.R) * per) + c1.R;
var grn = (short)Math.Round((c2.G - c1.G) * per) + c1.G;
var blw = (short)Math.Round((c2.B - c1.B) * per) + c1.B;
var clr = Color.FromArgb(red, grn, blw);
if (BkClr)
ctrl.BackColor = clr;
else
ctrl.ForeColor = clr;
}
}
这在第一次通过循环时工作正常,但每个后续循环都会不断向标签添加另一个秒表,并且闪烁变得疯狂。
杀死/检查该标签上是否已设置闪烁而不重新启动另一个秒表的最佳方法是什么?
我想我需要将我正在闪烁的标签传递给 SoftBlink 并在 while true 循环中以某种方式杀死现有的秒表?
解决方案
在标签的标签属性上设置一个标志来指示它是否在闪烁。
bool? blinking = ctrl.Tag as bool?;
Stopwatch sw;
if (!blinking ?? false)
{
ctrl.Tag = true;
sw = new Stopwatch();
while(true)
{
// do stuff
}
ctrl.Tag = false; // doesn't look like you would ever reach this point.
}
推荐阅读
- html - 反应打开子路由中的href而不是新链接
- javascript - 如何关闭/关闭赛普拉斯中的基本身份验证提示窗口?
- javascript - 反应重新填充现有的检查输入字段
- django - How can I extract URL of the video uploaded using Django Embed video
- java - Minecraft 的 3D 块模型作为项目工作,但在放置时变为空块(Minecraft Modding 1.16.5)
- nginx - nginx 上的反向代理 - 不向请求添加端口
- javascript - 阻止内容溢出和创建侧边栏
- php - PHP路径问题:看不到其中的目录和文件
- javascript - app.js 中的导入模块函数无权访问类实例化或 app.js 变量。Javascript 节点
- ansible - 将字典列表转换为 Ansible 中的字符串列表