System.Timers.Timer. In the Elapsed event, I do some stuff that is dispatched to the UI thread via SynchronizationContext.Post().NotificationPopup (simply a Form with some extras) and pushes it to a queue, which dequeues those Forms and shows them on screen. Just like a popup. If I don't use that Post() then the Forms have holes where the controls should be.