Здравствуйте, AlexNek, Вы писали:
AN>Может это какой то побочный эффект от CreateUIAsyncOperation(), потому как непонятно для чего она там нужна.
Да, это именно оно.
CreateUIAsyncOperation() создает асинхронную операцию "под управлением" GUI потока. С помощью этой операции можно выполнить код в потоке UI. Для этого нужно вызвать Post или PostOperationCompleted у этой операции и передать в эти методы код, который необходимо выполнить.
В методе DoAsyncSync (Janus-Common\Synchronization\SyncHelper.cs) присутствует код:
provider.GetRequiredService<IUIShell>()
.CreateUIAsyncOperation()
.PostOperationCompleted(state => syncFinishedHandler(syncPerformed, stats), null);
Здесь происходит запрос на выполнение в потоке GUI кода
syncFinishedHandler(syncPerformed, stats). В свою очередь syncFinishedHandler — метод переданный извне.
Например в методе SyncForums (Janus.Rsdn\Subscription\SubscribeForm.cs) он выглядит так:
(syncPerformed, stats) =>
{
if (syncPerformed)
RefreshForm();
}
Вот и получается:
1. GUI делает запрос на синхронизацию (SyncForums) и передает в качестве параметра syncFinishedHandler нужный код (в данном случае RefreshForm).
2. Создается новый (второй) поток и начинает синхронизацию сообщений (он также знает про syncFinishedHandler)
3. По окончании своей работы второй поток создает операцию для вызова кода в потоке GUI (System.ComponentModel.AsyncOperation через CreateUIAsyncOperation). Потом с помощью этой операции выполняет в потоке GUI код, запомненный в syncFinishedHandler, т.е. фактически обновляет формы.
Вот как-то так.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>