【问题标题】:Windows Phone Timer interval not consistentWindows Phone 计时器间隔不一致
【发布时间】:2012-01-29 15:58:05
【问题描述】:

我正在寻找使用 C# 创建一个 Windows Phone 应用程序。我想要一个计时器,它显示一个图像 100 毫秒,然后切换到另一个图像,然后再等待 900 毫秒,然后再次闪烁图像。我写了下面的代码,但是,它似乎并没有持续闪烁。有什么想法吗?

public partial class MainPage : PhoneApplicationPage
{
    DispatcherTimer timer = new DispatcherTimer();
    List<string> files = new List<string>() { "Images/off-light.png", "Images/on-light.png" };
    List<BitmapImage> images = new List<BitmapImage>();
    int current = 0;

    // Constructor
    public MainPage()
    {
        InitializeComponent();

        foreach (string file in files)
        {
            BitmapImage image = new BitmapImage(new Uri(file, UriKind.Relative));
            images.Add(image);
        }


            timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(900);
            timer.Tick += new EventHandler(timer_Tick);

    }

    void timer_Tick(object sender, EventArgs e)
    {
        myImage.Source = images[current];
        current++;
        if (current >= files.Count)
        {
            current = 0;
            timer.Interval = TimeSpan.FromMilliseconds(100);
            timer.Stop();
            timer.Start();
        }
        else
        {
            timer.Interval = TimeSpan.FromMilliseconds(900);
            timer.Stop();
            timer.Start();
        }

    }

    private void btnStop_Click(object sender, RoutedEventArgs e)
    {
        timer.Stop();
        myImage.Source = images[0];
    }

    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
        timer.Start();
    }
}

【问题讨论】:

  • 在这种情况下“不一致”是什么意思?图像是否闪烁一次,然后不再闪烁?它的停留时间是长于还是短于 100 毫秒?此外,您可能会考虑更改操作顺序。停止计时器,设置间隔,然后重新启动计时器。虽然说实话,我认为你可以只设置间隔而不停止/重新启动。
  • 不一致,因为图像显示的时间不是真正的 100 毫秒,也不是每次都真正等待 900 毫秒。我将尝试设置间隔而不停止和重新启动。
  • 当我在这段代码中放一行来播放点击类型的 mp3 文件时,我真正注意到的地方是: if (current >= files.Count) { current = 0; timer.Interval = TimeSpan.FromMilliseconds(100);计时器.停止();计时器.Start();我有时会连续多次听到“咔哒”声,有时只听到一次。但绝对不一致。听起来好像有多个计时器。

标签: c# windows-phone-7 timer intervals


【解决方案1】:

DispatchTimer 文档说:

不保证定时器在时间间隔发生时准确执行,但保证在时间间隔发生之前不执行。这是因为 DispatcherTimer 操作像其他操作一样放置在 Dispatcher 队列中。 DispatcherTimer 操作何时执行取决于队列中的其他作业及其优先级。

我不知道这是否是导致您的问题的原因,因为我从未与 DispatchTimer 合作过。

您确实有其他计时器选项。例如,您可以使用System.Timers.TimerSystem.Threading.Timer(我推荐使用System.Timers.Timer)。但请注意,如果您使用其中一个计时器,回调将在池线程上执行,您需要同步对 UI 线程的访问。再次来自DispatchTimer 文档:

如果在 WPF 应用程序中使用 System.Timers.Timer,则值得注意的是,System.Timers.Timer 在与用户界面 (UI) 线程不同的线程上运行。为了访问用户界面 (UI) 线程上的对象,有必要使用 Invoke 或 BeginInvoke 将操作发布到用户界面 (UI) 线程的 Dispatcher。使用 DispatcherTimer 而不是 System.Timers.Timer 的原因是 DispatcherTimer 与 Dispatcher 在同一线程上运行,并且可以在 DispatcherTimer 上设置 DispatcherPriority。

您可能会考虑提高计时器的优先级?

【讨论】:

    【解决方案2】:

    我不太喜欢 winforms/wpf/silverlight,但我想说你需要使你的窗口无效。

    调用刷新渲染所需的任何方法,因为我认为更改源图像不会触发刷新

    【讨论】:

      猜你喜欢
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多