【问题标题】:C#, Triggering different events with timer.C#,使用计时器触发不同的事件。
【发布时间】:2018-05-08 14:30:34
【问题描述】:

我想使用计时器在按下按钮 10 秒后触发一个事件,然后在 20 秒后自动触发另一个事件,然后让计时器在 30 秒后停止。任何帮助深表感谢。

【问题讨论】:

  • 要么链接它,要么做数学
  • “然后让计时器在 30 秒后停止”是什么意思?

标签: c# events timer triggers


【解决方案1】:

我们开始(WPF):

async void OnButtonClick(object sender, RoutedEventArgs e)
{
    var cts = new CancellationTokenSource();
    void OnCancel(object _, RoutedEventArgs __) => cts.Cancel();
    CancelButton.Click += OnCancel;

    try
    {
        await Task.Delay(TimeSpan.FromSeconds(2), cts.Token);

        // fire first event

        await Task.Delay(TimeSpan.FromSeconds(2), cts.Token);

        // fire second event

        await Task.Delay(TimeSpan.FromSeconds(2), cts.Token);

        // stop the timer (whatever it means)
    }
    catch (TaskCanceledException)
    {
        // handle cancelled
    }
    finally
    {
        CancelButton.Click -= OnCancel;
    }
}

更新:添加取消。

【讨论】:

  • 谢谢,我还想添加一个取消按钮,用户可以按下它来取消整个操作。我该怎么做?
  • 添加取消。
  • 在第一次“等待”之后,我们不再保证在 GUI 线程上运行,对吧?可能值得评论。此外,如果我们在 WPF 中工作,我们可以选择使用 WPF 的计时器类,但这样做似乎没有什么好处(它不会在 GUI 线程上调用,因此在那里没有帮助)。对于好奇:msdn.microsoft.com/en-gb/library/…
  • 我们保证在这里一直在 UI 线程中运行。 await 将在与前一部分相同的同步上下文或任务调度程序中调度函数的其余部分。在这里,我们处于主 (UI) WPF 线程的上下文中,该线程有一个任务调度程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多