Если глянуть на вызов SyncForm, то немодальная форма создается из треада.
Janus\Core\Synchronization\UI\SyncForm.cs
Janus\Core\Synchronization\Synchronizer.cs (PerformSyncSession)
Janus-Common\Synchronization\SyncHelper.cs (DoAsyncSync)
Каким образом все работает, если в дополнительном треаде нет DoEvents?
Спрашиваю потому, что перестало работать и целый вечер искал без толку.
Может это какой то побочный эффект от CreateUIAsyncOperation(), потому как непонятно для чего она там нужна.
Здравствуйте, 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>>
Здравствуйте, Буравчик, Вы писали:
Б> AN>Может это какой то побочный эффект от CreateUIAsyncOperation(), потому как непонятно для чего она там нужна.
Б> Да, это именно оно.
Б> CreateUIAsyncOperation() создает асинхронную операцию "под управлением" GUI потока. С помощью этой операции можно выполнить код в потоке UI. Для этого нужно вызвать Post или PostOperationCompleted у этой операции и передать в эти методы код, который необходимо выполнить.
Ну прямо писатель
, спасибки, я там потом увидел SynchronizationContext и понял откуда ветер дует. Теперь бы еще понять отчего перестало работать, окошко просто морозится и всё.
Кстати, помнишь ты писал про синхронизацию потоков при создании базы, так повтор DoEvents приводит к исчезновению контекстного меню в трее. Я этот цикл случайно всегда выполнял (и у меня выход там есть через 10 секунд).
То бишь после первого старта с созданием базы будет отсутствовать контекстное меню.
Здравствуйте, AlexNek, Вы писали:
AN> Спрашиваю потому, что перестало работать и целый вечер искал без толку.
Винда, что ли у меня дуреет, сейчас запустил все работает.