This isn't a direct answer to your question - but you might find it helpful.
It's a completely different way to go that uses Reactive Extensions (create a console app and add Nuget package "Rx-Testing") and also demonstrates how you can virtualize time which can be helpful for testing purposes. You can control time as you please!
using System;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
namespace BallFlight
{
class Program
{
static void Main()
{
var scheduler = new HistoricalScheduler();
// use this line instead if you need real time
// var scheduler = Scheduler.Default;
var interval = TimeSpan.FromSeconds(0.75);
var subscription =
Observable.Interval(interval, scheduler)
.TimeInterval(scheduler)
.Scan(TimeSpan.Zero, (acc, cur) => acc + cur.Interval)
.Subscribe(DrawBall);
// comment out the next line of code if you are using real time
// - you can't manipulate real time!
scheduler.AdvanceBy(TimeSpan.FromSeconds(5));
Console.WriteLine("Press any key...");
Console.ReadKey(true);
subscription.Dispose();
}
private static void DrawBall(TimeSpan t)
{
Console.WriteLine("Drawing ball at T=" + t.TotalSeconds);
}
}
}
Which gives the output:
Drawing ball at T=0.75
Drawing ball at T=1.5
Drawing ball at T=2.25
Drawing ball at T=3
Drawing ball at T=3.75
Drawing ball at T=4.5
Press any key...