Sobre a classe Timer e a precisão em milissegundos

Boa noite pessoal,

Fiz uma pequena aplicação que funciona como um cronômetro e usei a classe Timer, porém o intervalo entre os “ticks” do Timer são bastante imprecisos quando tento atualizar um TextBox na casa dos milissegundos e o resultado acaba ficando errado…

Minhas dúvidas são: tem alguma forma de dar esse delay do Timer de uma maneira precisa? Se não, como eu poderia atualizar TextBox na aplicação onde eu poderia mostrar os milissegundos de forma certa desse jeito?

Pesquisei e achei que posso fazer cálculos precisos com a classe Stopwatch, mas não tenho ideia de como atualizar o TextBox de maneira correta…

PS: o método “OnMainTimerTick” atualiza o TextBox

Aqui o código:

using System.Windows.Forms;
using System.Drawing;
using System;

public class Window : Form
{
    private Button _BtnStart;
    private Button _BtnPause;
    private Button _BtnClear;
    private TextBox _TxtBoxTime;

    private Timer _MainTimer;
    private short _milli  = 0;
    private short _min    = 0;
    private short _second = 0;

    public Window()
    {
        Application.EnableVisualStyles();
        Text = "Cronômetro";
        Size = new Size(300, 110);
        FormBorderStyle = FormBorderStyle.FixedSingle;
        MaximizeBox = false;
        CenterToScreen();

        _MainTimer = new Timer();
        _MainTimer.Interval = 1;
        _MainTimer.Tick += new EventHandler(OnMainTimerTick);

        InitControls();
        UpdateEnabledControls();
    }

    private void InitControls()
    {
        _TxtBoxTime = new TextBox();
        _TxtBoxTime.Parent = this;
        _TxtBoxTime.Location = new Point(10, 10);
        _TxtBoxTime.Size = new Size(265, 35);
        _TxtBoxTime.TextAlign = HorizontalAlignment.Center;
        _TxtBoxTime.Text = "00:00:000";
        _TxtBoxTime.ReadOnly = true;
        _TxtBoxTime.BackColor = Color.White;

        _BtnStart = new Button();
        _BtnStart.Parent = this;
        _BtnStart.Location = new Point(10, 40);
        _BtnStart.Text = "&Iniciar";
        _BtnStart.Click += new EventHandler(OnStartBtnClick);

        _BtnPause = new Button();
        _BtnPause.Parent = this;
        _BtnPause.Location = new Point(90, 40);
        _BtnPause.Text = "&Pausar";
        _BtnPause.Click += new EventHandler(OnPauseBtnClick);

        _BtnClear = new Button();
        _BtnClear.Parent = this;
        _BtnClear.Location = new Point(170, 40);
        _BtnClear.Text = "&Zerar";
        _BtnClear.Click += new EventHandler(OnBtnClearClick);
       
    }

    private void OnStartBtnClick(object source, EventArgs e)
    {
        if (_MainTimer.Enabled)
            return;

        _MainTimer.Start();
        UpdateEnabledControls();
    }

    public void OnPauseBtnClick(object source, EventArgs e)
    {
        if (!_MainTimer.Enabled)
            return;

        _MainTimer.Stop();
        UpdateEnabledControls();
    }

    private void OnMainTimerTick(object source, EventArgs e)
    {
        _TxtBoxTime.Text = string.Format("{0:D2}:{1:D2}:{2:D3}", _min, _second, _milli);
        _milli += 1;
        //UpdateEnabledControls();

        if (_milli == 999)
        {
            _milli   = 0;
            _second += 1;
        }

        if (_second == 59)
        {
            _min   += 1;
            _second = 0;
        }
    }

    private void OnBtnClearClick(object source, EventArgs e)
    {
        if (_MainTimer.Enabled)
            OnPauseBtnClick(null, null);

        _milli = _second = _min = 0;
        _TxtBoxTime.Text = "00:00:000";

        UpdateEnabledControls();
    }

    private void UpdateEnabledControls()
    {
        _BtnStart.Enabled = ! _MainTimer.Enabled;
        _BtnPause.Enabled = _MainTimer.Enabled;
        _BtnClear.Enabled = ! ((_milli == 0) && (_second == 0) && (_min == 0));
    }

    static void Main()
    {
        Application.Run(new Window());
    }
}