Хммм, я использовал разные сценарии, которые зависели от того, что мне было нужно в то время.
Я полагаю, что BeginInvoke, вероятно, будет проще всего кодировать, так как вы почти у цели. В любом случае вы уже должны использовать Invoke, поэтому просто перейдите на BeginInvoke. Использование обратного вызова в отдельном потоке позволит выполнить то же самое (при условии, что вы используете пул потоков для постановки в очередь обратного вызова), как при использовании BeginInvoke.