【发布时间】:2018-01-20 03:42:03
【问题描述】:
我有 2 个复选框。 Checkbox_toggle 选中后,将启动一个切换序列。此切换序列将使用计时器/延迟检查和取消选中 Checkbox_control。
只要 Checkbox_toggle 被选中,我希望它继续循环。但是, Thread.Sleep 不适用于我的目的,因为我需要程序的其余部分继续运行。我查看了BackgroundWorker,但我找不到一个例子/我对它的理解不够好,无法将它应用到我的程序中。我正在使用 .NET 4.0,所以我不能使用 Task.Delay。
我知道BackgroundWorker 有ProgressChanged 事件可用于更新用户界面,但我不确定如何将它用于我的应用程序。我也愿意接受不是BackgroundWorker 的另一种解决方案。
我尝试使用 Task.Delay 的这个 .NET 4.0 实现,但它没有按我的意愿工作。它贯穿了所有这些,但延迟实际上并没有延迟循环
public static System.Threading.Tasks.Task Delay(double milliseconds)
{
var tcs = new TaskCompletionSource<bool>();
System.Timers.Timer timer = new System.Timers.Timer();
timer.Elapsed += (obj, args) =>
{
tcs.TrySetResult(true);
};
timer.Interval = milliseconds;
timer.AutoReset = false;
timer.Start();
return tcs.Task;
}
private void Checkbox_toggle_CheckedChanged(object sender, EventArgs e)
{
while (Checkbox_toggle.Checked == true)
{
Checkbox_control.Checked = true;
Delay(1000);
Checkbox_control.Checked = false;
Delay(1000);
}
}
在这里找到任务延迟事件:https://stackoverflow.com/a/15342256/8407531
我的实际问题:如何在不使用 Thread.Sleep 的情况下切换计时器上的复选框,或者如何将其偏移到另一个线程?如果可能的话,这个延迟需要从其他线程进行调整。
【问题讨论】:
-
不要使用
BackgroundWorker,使用System.Windows.Forms.Timer。