调度定时器标记重复进程
本文关键字:进程 定时器 调度 | 更新日期: 2023-09-27 17:50:58
我正在执行一个项目的计时器。每当按下按钮时,计时器就会被触发。
在第一次按下,它设置定时器的持续时间,然后开始定时器。每当计时器滴答时,程序减少持续时间并将其打印到屏幕上。它工作得很完美……直到计时器运行时再次按下按钮。当你这样做时,在tick事件中的动作发生的次数,你按下按钮,而它正在运行。
我的XAML看起来像这样。
<Grid Grid.Row="1">
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock x:Name="tBox" Text="TIMER" Grid.Row="0" HorizontalAlignment="Center" Style="{StaticResource PhoneTextTitle2Style}"/>
<TextBlock x:Name="timer" Text="00" Grid.Row="1" HorizontalAlignment="Center" Style="{StaticResource PhoneTextTitle1Style}"/>
</Grid>
<Button
Grid.Row="1"
Grid.Column="0"
Content="Online"
HorizontalAlignment="Center"
Width="200"
Height="75" Click="trigger" />
我的c#是这样的:
public partial class MainPage : PhoneApplicationPage
{
int duration = 0;
int converted = 0;
int count = 0;
DispatcherTimer tmr = new DispatcherTimer();
// Constructor
public MainPage()
{
InitializeComponent();
}
private void trigger(object sender, RoutedEventArgs e)
{
resetTimer();
timer.Text = "30";
tmr.Interval = TimeSpan.FromSeconds(1);
tmr.Tick += OnTimerTick;
tmr.Start();
}
void OnTimerTick(object sender, EventArgs args)
{
converted = duration - 1;
timer.Text = converted.ToString();
duration = converted;
tBox.Text = strConvert;
count = count + 1;
if (duration == 0)
{
tmr.Stop();
}
}
void resetTimer()
{
count = 0;
DispatcherTimer tmr = new DispatcherTimer();
tmr.Interval = TimeSpan.FromSeconds(0);
duration = 30;
converted = 0;
tmr.Stop();
}
}
不要在方法中添加Tick
事件的处理程序。添加Tick
事件处理程序,设置间隔,并在创建窗口时(即在构造函数中)创建计时器一次,然后当按钮仅按Start
计时器。
你也不应该在按钮被按下时创建一个新的计时器;你可以而且应该重用现有的计时器。
你实际上并没有多次触发计时器。正在发生的事情是,您每次按下按钮时都将相同的方法添加到Tick
事件中作为处理程序,因此当Tick
事件触发一次时,您的方法被调用多次。在已经运行的计时器上调用Start
不会导致它多次触发,它只会重置它的间隔(我认为这是所需的)。
问题是每次调用trigger()时都要添加OnTimerTick处理程序方法的新实例,从它的签名中我可以假设是每当用户单击按钮时。
我会做两件事中的一件;要么删除/禁用trigger()方法主体中的按钮,这样用户就不能多次单击它,要么在附加OnTimerTick引用之前检查Tick事件以确保它为空(没有处理程序)。
重写reset方法,以便在关闭现有计时器之前不创建新的计时器引用。
void resetTimer()
{
count = 0;
tmr.Stop();
tmr.Interval = TimeSpan.FromSeconds(0);
duration = 30;
converted = 0;
}
同样,在页面加载
上设置Tick事件处理程序// Constructor
public MainPage()
{
InitializeComponent();
timer.Text = "30";
tmr.Interval = TimeSpan.FromSeconds(1);
tmr.Tick += OnTimerTick;
}
private void trigger(object sender, RoutedEventArgs e)
{
resetTimer();
tmr.Start();
}
更是如此
你应该在tick方法执行时停止计时器,除非你不介意它多次运行,如果tick方法需要一段时间来执行
void OnTimerTick(object sender, EventArgs args)
{
tmr.Stop();
converted = duration - 1;
timer.Text = converted.ToString();
duration = converted;
tBox.Text = strConvert;
count = count + 1;
tmr.Start();
}