Если вы можете использовать платформу параллельного расширения, я нашел это полезным:
TaskScheduler uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Я сделал это в своем конструкторе, поэтому я был в основном потоке.
Тогда я бы назвал Task
, поэтому сделайте так: private void changeElements () {(new Task (() => {// do ui update})). Start (uiScheduler);}
Таким образом, вы можете выполнять все нужные вам задачи, и при использовании BeginInvoke
он удаляет много лишнего кода, поскольку вам больше не нужен делегат.
Но, как было указаноу вас нет необходимости вызывать несколько вызовов BeginInvoke
для обновления пользовательского интерфейса, поскольку после первого вы уже находитесь в главном потоке.