Odliczamy Możesz stworzyć statyczną zmienną DateTime do swojego projektu i przechowywać w niej czas uruchomienia aplikacji poprzez uzupełnienie jej datą w głównym konstruktorze aplikacji.

Później tą zmienną porównujemy z obecnym czasem ,aby otrzymać okres, w jakim działała aplikacja.

Oto wykonanie tego pomysłu w aplikacji WPF.

using System;
using System.Windows;

namespace WpfApplication1
{

    public partial class MainWindow : Window     
    {
        public MainWindow()
        {
            InitializeComponent();
            MyTime.Start = DateTime.Now;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            TimeSpan span = DateTime.Now - MyTime.Start;
            MessageBox.Show(span.TotalSeconds.ToString());
        }
    }

    public static class MyTime {
        public static DateTime Start { get; set; }
    }
}

Oto przykład wykonanie tego pomysłu w aplikacji konsolowej. W aplikacja konsolowej przypisanie czasu musi nastąpić w metodzie Main jeśli przypiszemy czas w konstruktorze będziemy mieli czas w którym aplikacje została pierwszy raz skompilowana.

using System;

namespace ConsoleApplication3
{
    class Program     
    {  
        static void Main(string[] args)
        {
            MyTime.Start = DateTime.Now;
            Console.ReadKey();
            TimeSpan span = DateTime.Now - MyTime.Start;
            Console.WriteLine(span.TotalSeconds);
            Console.ReadKey();
        }
    }

    public static class MyTime 
    {
        public static DateTime Start { get; set; } 
    }
}

Oczywiście wada tej metody polega na tym ,że musimy napisać swój własnego kodu.

Nie musimy jednak ,aż tak się rozpisywać w .NET ma przygotowane klasy i metody do wykonania tego celu.

Pobierają proces naszej aplikacji, jeśli wstanie też pobrać jej czas startu bez tworzenia statycznych zmiennych.

var current = System.Diagnostics.Process.GetCurrentProcess();
DateTime startedAt = current.StartTime;

Metody te działają ,ale co jeśli użytkownikzmieni zegar.

image

Niestety obie metody są zależne od właściwości DateTime.Now ,a ona zwraca obecną datę ustawioną w systemie. Jeśli czas w systemie ulegnie zmianie metoda ta jest niewiarygodna.

Istnieje jeszcze trzecia metoda, która zawsze będzie działać bez względu na to co się dzieje z zegarem systemowym. Zajrzymy więc do klasy “StopWatch”.

Instancja klasy “StopWatch” oferuje obliczanie różnicy w czasie zupełnie jak stoper w zegarku. Typowo w tej klasie wywołujemy metodę Start() by zacząć mierzyć czas i metodę Stop() aby ten proces skończyć. Gdy chcemy mierzyć różnicę ponownie warto pamiętać o metodzie Reset().

Użycie tej aplikacji

using System;
using System.Diagnostics;

namespace ConsoleApplication3
{
    class Program     {
        static void Main(string[] args)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();
            Console.ReadKey();
            stopWatch.Stop();

            TimeSpan ts = stopWatch.Elapsed;

            string elapsedTime = String.Format
                ("{0:00}:{1:00}:{2:00}.{3:00}",
                ts.Hours, ts.Minutes, ts.Seconds,
                ts.Milliseconds / 10);
            Console.WriteLine("RunTime " + elapsedTime);
            Console.ReadKey();
        }
    }
}

Jak ta klasa mierzy czas.

Jeśli twój sprzęt na komputerze posiada zegar o wysokiej częstotliwości to instancja klasy StopWatch() będzie mierzyć czas właśnie za pomocą tego zegara. Niezależnie jak użytkownik zmieni swoją datę w systemie operacyjnym wynik zawsze będzie wiarygodny.

W przeciwnym wypadku klasa StopWatch() używa zegara systemowego co tworzy znowu problem ze zmianą czasu.

Aby mieć stuprocentową pewność ,że klasa StopWatch() mierzy czas za pomocą zegara mechanicznego używamy statycznej metody z IsHightResolution().

bool works = System.Diagnostics.Stopwatch.IsHighResolution;

To by było na tyle.