.net DispatcherTimer应用间隔并立即执行

dxpyg8gm  于 2022-12-20  发布在  .NET
关注(0)|答案(5)|浏览(157)

基本上,当我们应用一些间隔,即5秒,我们必须等待它。
是否可以应用间隔并立即执行计时器,而不等待5秒?(我指的是间隔时间)。
有线索吗?
谢谢!

public partial class MainWindow : Window
    {
        DispatcherTimer timer = new DispatcherTimer();

        public MainWindow()
        {
            InitializeComponent();

            timer.Tick += new EventHandler(timer_Tick);
            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);
        }

        void timer_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("!!!");
        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)
        {
            timer.Interval = new TimeSpan(0, 0, 5);
            timer.Start();
        }
    }
rt4zxlrg

rt4zxlrg1#

当然还有更优雅的解决方案,但一个比较好的方法是在初始设置时间间隔后调用timer_Tick方法,这比在每次tick时都设置时间间隔要好。

cyej8jka

cyej8jka2#

最初将间隔设置为零,然后在后续调用时增大它。

void timer_Tick(object sender, EventArgs e)
{
    ((Timer)sender).Interval = new TimeSpan(0, 0, 5);
    MessageBox.Show("!!!");
}
a64a0gku

a64a0gku3#

可以试试这个:

timer.Tick += Timer_Tick;
timer.Interval = 0;
timer.Start();

//...

public void Timer_Tick(object sender, EventArgs e)
{
  if (timer.Interval == 0) {
    timer.Stop();
    timer.Interval = SOME_INTERVAL;
    timer.Start();
    return;
  }

  //your timer action code here
}

另一种方法是使用两个事件处理程序(以避免在每次滴答时都检查“if”):

timer.Tick += Timer_TickInit;
timer.Interval = 0;
timer.Start();

//...

public void Timer_TickInit(object sender, EventArgs e)
{
    timer.Stop();
    timer.Interval = SOME_INTERVAL;
    timer.Tick += Timer_Tick();
    timer.Start();
}

public void Timer_Tick(object sender, EventArgs e)
{
  //your timer action code here
}

然而,更清洁的方法是已经建议的:

timer.Tick += Timer_Tick;
timer.Interval = SOME_INTERVAL;
SomeAction();
timer.Start();

//...

public void Timer_Tick(object sender, EventArgs e)
{
  SomeAction();
}

public void SomeAction(){
  //...
}
gzjq41n4

gzjq41n44#

我就是这么解决的:

dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Tick += new EventHandler(DispatcherTimer_Tick);
dispatcherTimer.Interval = new TimeSpan(0, 0, 10);
dispatcherTimer.Start();

DispatcherTimer_Tick(dispatcherTimer, new EventArgs());

为我工作没有任何问题。

yqhsw0fo

yqhsw0fo5#

**免责声明:**此答案不适用于OP,因为他希望使用DispatcherTimer

但如果您没有此限制,并且可以使用另一个Timer,则有一个更干净的解决方案
您可以使用System.Threading.Timer

最重要的是设置dueTime:0

System.Threading.Timer timer = new Timer(Callback, null, dueTime:0, period:10000);

dueTime的文档如下
调用回调之前延迟的时间量(毫秒)。指定“无限”将阻止计时器启动。指定零(0)将立即启动计时器。
你的回调是这样的

private void Callback(object? state) =>
{
}

同样,这没有使用DispatcherTimer,但它可以解决您的问题
Related answer

相关问题