为什么在 C# 中启用计时器时不能执行任何其他操作



当我在运行程序时启用计时器时,我的程序将不会执行任何其他操作并停止执行任何单击,我喜欢退出程序或其他任何事情,我只是在这个计时器中遇到了这个问题,当我启用它们时,我还有另一个 2 个计时器没有问题,启用它时是我在那个计时器上的代码:

private void timer1_Tick(object sender, EventArgs e)
{

bool check = login.remain_AttemptsTime();
if (check)
{
login.reset_afterRestricted();
timer1.Enabled = false;
textBox1.Enabled = true;
textBox2.Enabled = true;
button1.Enabled = true;
}
else
{
timer1.Enabled = true;
textBox1.Enabled = false;
textBox2.Enabled = false;
button1.Enabled = false;
}
}

您还没有指定计时器(.NET 中很容易有十几个计时器(,但我要介绍 WindowsForms 一个。此外,这听起来很像"长时间运行期间程序无响应"的情况。这意味着是时候学习多任务处理了。

每个线程只能运行一段代码。WindowsForms(与大多数GUI环境一样(基于EventQueue。一个重要的规则是每个事件必须尽快返回。当一个事件运行时,其他代码(甚至用于重绘 UI 的代码或向窗口确认已收到输入的代码(都无法运行。

WindowsForms 计时器(和其他几个计时器(将其事件放入事件队列中。如果login.remain_AttemptsTime()长时间运行(例如数据库访问(,则 Windows 窗体将变得无响应,直到请求返回或超时。然后在 100 毫秒后重复它,所以你基本上只能在锁定的线程海洋中闲置。这样的操作必须通过某种形式的多任务处理来完成。

由于这可能是您第一次遇到多任务处理需求,因此我建议使用BackgroundWorker 进行多任务处理。它已经过时了,永远不应该在生产代码中使用,但至少在我的专业意见中,没有什么比学习 BGW+WindowsForms 更好的了。

最新更新