public Task Run(Action <OverlayWindow, Graphics> drawMethod, CancellationToken cToken) { return(Task.Run(() => { using (System.Timers.Timer t = new System.Timers.Timer() { AutoReset = false, Interval = desiredDrawInterval }) { t.Elapsed += (object sender, System.Timers.ElapsedEventArgs e) => { try { // Ensure this is on top of the game. _window.PlaceAboveWindow(windowHook); // Begin a new scene/frame. _graphics.BeginScene(); // Clear the previous scene/frame. _graphics.ClearScene(); drawMethod.Invoke(_window, _graphics); // End the scene/frame rendering. _graphics.EndScene(); } finally { try { ((System.Timers.Timer)sender).Start(); } catch { } } }; t.Start(); try { Task.WaitAll(Task.Delay(-1, cToken)); } catch { } } }, cToken)); }