Friday, May 17, 2013

What is DispatcherTimer in wpf?

DispatcherTimer

When you want to set a timer working with GUI, you always come across threading problem. The problem is that if you want to send some changes to UI that is constantly/continuously changing then that will make your UI unresponsive or in other words it will hang your UI.

To overcome from this situation, WPF gives us DispatcherTimer threading functionality that will take care of such continuously changing processing on UI thread and that will not hang your UI.
We can accomplish same scenario in Win Form, through System.Windows.Forms.Timer and in WPF it is System.Windows.Threading.DispatcherTimer.

Difference between DispatcherTimer and Regular timer (System.Timers.Timer)

DispatcherTimer is the regular timer. It fires its Tick event on the UI thread, you can do anything you want with the UI.
System.Timers.Timer is an asynchronous timer, its Elapsed event runs on a thread pool thread.
You have to be very careful in your event handler, you are not allowed to touch any UI component.
And you'll need to use the lock statement where ever you access class members that are also used on the UI thread.

Example

Here, I am posting an example how to use DispatcherTimer.
The example is to show counter that starts counting from 0. We have Start and Stop buttons to start counting and stop counting.

XAML code for UI:

<Window x:Class="DispatcherTimerExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="95" Width="525">
    <Grid Margin="10">
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition Width="*" />
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>   
    <TextBlock Grid.Column="0"
               Height="23"
               HorizontalAlignment="Left"
               Margin="5"
               Name="textBlock1"
               Text="Timer Value:"
               VerticalAlignment="Top" />
    <TextBox Grid.Column="1"
             x:Name="txtStatus"
             IsReadOnly="True"
             Background="AliceBlue"
             Foreground="Red"
             Height="23"
             HorizontalAlignment="Left"
             Margin="5,5,0,0"
             VerticalAlignment="Top"
             Width="233"
             Text="Press start to count."/>
    <Button Content="Start"
            Grid.Column="2"
            Height="23"
            HorizontalAlignment="Left"
            Margin="5"
            Name="btnStart"
            VerticalAlignment="Top"
            Width="75"
            Click="btnStart_Click" />
    <Button Content="Stop"
            Grid.Column="3"
            Height="23"
            HorizontalAlignment="Left"
            Margin="5"
            Name="btnStop"
            VerticalAlignment="Top"
            Width="75"
            Click="btnStop_Click" />
  </Grid>
</Window>

Code behind for this application which contains use of DispatcherTimer.

Code C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Threading;

namespace DispatcherTimerExample
{
  /// <summary>
  /// Interaction logic for MainWindow.xaml
  /// </summary>
  public partial class MainWindow : Window
  {
   
    DispatcherTimer _timer;
    int count = 0;

    public MainWindow()
    {
      InitializeComponent();
      //Create new instance of DispaterTimer
      _timer = new DispatcherTimer();

      //The continuously changing properties should go under the Tick event handler
      //so that it could be taken into UI thread and UI stays responsive.
      _timer.Tick += new EventHandler(_timer_Tick);
    }
   
    void _timer_Tick(object sender, EventArgs e)
    {
      //Assigns count to the textblock.
      txtStatus.Text = (count++).ToString();
    }

    /// <summary>
    /// Starts the counting.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnStart_Click(object sender, RoutedEventArgs e)
    {
      // Set the Interval
      _timer.Interval = TimeSpan.FromMilliseconds(Convert.ToDouble(1));
      // Start the timer
      _timer.Start();
      txtStatus.Text = "Started";
    }

    /// <summary>
    /// Stops the counting.
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void btnStop_Click(object sender, RoutedEventArgs e)
    {
      // Stop the timer
      _timer.Stop();
      txtStatus.Text = "Stopped at : " + count.ToString();
    }
  }
}

Use of DispatcherTimer

Other use of DispatcherTimer is ProgressBar functionality where you can show progress on certain property changes. I will try to post ProgressBar functionality of Start and End date.

1 comment:

  1. What Is Dispatchertimer In Wpf? >>>>> Download Now

    >>>>> Download Full

    What Is Dispatchertimer In Wpf? >>>>> Download LINK

    >>>>> Download Now

    What Is Dispatchertimer In Wpf? >>>>> Download Full

    >>>>> Download LINK jZ

    ReplyDelete