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.
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.