まず、この小さなテストを実行して、ほぼリアルタイムでドリフトを確認する必要があります。72回のタイマー経過イベントの後に1秒が失われます(これは実際の作業がほとんどない場合です)。
using (var timer = new Timer(1000))
{
    var start = DateTime.Now;
    var i = 0;
    timer.Elapsed += (sender, args) => Console.WriteLine("{0} -> {1}", ++i, (DateTime.Now - start).TotalMilliseconds);
    timer.Start();
    Thread.Sleep(130*1000);
}
アプリがどれほど正確である必要があるかはわかりませんが、開始時間と現在のデルタを使用し、それを初期値から差し引いてタイマーをゼロにすることで、「十分に良い」ものを得ることができます。  このアプローチでは秒を失うことになり、秒を失う可能性があります@ダニ0:00を引き起こし-0:01ます。これを処理する必要があります。
var countdownSeconds = 120;
var startedAt = DateTime.Now;
var timer = new Timer(1000);    
timer.Elapsed += (sender, args) => Display(countdownSeconds - (int)((DateTime.Now - startedAt).TotalSeconds));
timer.Start();
//- be sure to dispose the timer