Таймер не может быть остановлен в C#
У меня есть таймер в форме Windows (C# 3.0, .net 3.5 SP1, VS2008 SP1, Vista), который, кажется, работает даже после остановки. Код такой:
using System;
using System.Windows.Forms;
namespace TestTimer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
StartTimer();
}
private DateTime deadline;
private void StartTimer()
{
deadline = DateTime.Now.AddSeconds(4);
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
int secondsRemaining = (deadline - DateTime.Now).Seconds;
if (secondsRemaining <= 0)
{
timer1.Stop();
timer1.Enabled = false;
MessageBox.Show("too slow...");
}
else
{
label1.Text = "Remaining: " + secondsRemaining.ToString() + (secondsRemaining > 1 ? " seconds" : " second");
}
}
}
}
Даже после вызова timer1.Stop () я продолжаю получать сообщения MessageBox на экране. Когда нажимаю esc, он останавливается. Как бы то ни было, я ожидал, что появится только одно окно сообщения ... Что еще мне делать? добавление timer1.Enabled = false не меняет поведения.
Спасибо
Ответов (3)3
Здесь могут действовать несколько факторов.
Модальный MessageBox.Show () может препятствовать тому, чтобы остановка таймера вступила в силу до тех пор, пока она не будет отклонена (как указал Брайан).
Таймер1_Tick может выполняться в фоновом потоке. Вызовы пользовательского интерфейса, такие как MessageBox.Show () и фоновые потоки, не должны смешиваться.
Обе проблемы можно решить, используя BeginInvoke для вызова метода, отображающего окно сообщения.
Обратите внимание, что в следующем нет необходимости:
timer1.Stop();
timer1.Enabled = false;
Stop()
то же самое, что и Enabled=false
. И Start()
то же самое, что и Enabled=true
.
http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.enabled.aspx