Сообщение Synchronizationcontext зависает до тех пор, пока оно не будет принудительно
ПРИВЕТ! Мы разрабатываем довольно сложное многопоточное приложение WinForms C#.
Для синхронизации выполнения мы используем объект контекста синхронизации. Это работает, как и ожидалось, но для одного конкретного случая.
Делегат, запланированный для выполнения методом Post (), вызываемым в какой-то момент, не выполняется до тех пор, пока "что-то" не заставит его выполнить.
Точнее, просто для тестирования я добавил кнопку в основную форму и внутри метода Click кнопки запустил избыточный метод Post() в том же контексте синхронизации.
В результате все ранее запланированные делегаты выполняются, а это значит, что они где-то хранились и не были потеряны.
Может ли кто-нибудь объяснить, почему делегаты висят и что нужно сделать, чтобы заставить их работать без лишних усилий?
Ниже приводится подробное описание сценария.
Во-первых, приложение создает главное окно. В его Onload () мы сохраняем текущий контекст синхронизации (SC) и вызываем функцию Post() для тестирования. Это работает, и соответствующий делегат запускается "немедленно", как и ожидалось.
Дочернее окно создается в главном потоке (внутри главного окна OnLoad) (точнее, это окно стыковки. Мы используем док-библиотеку WeifenLuo). В этом дочернем окне хранится контекст синхронизации главного окна (SC).
Другой рабочий поток одновременно создает объект, назовем его publisher (P).
Сразу же после создания дочернего окна (SC уже сохранен на данный момент) оно подписывается на событие publisher (P). Если событие происходит, то в его обработчике мы вызываем Post() для сохраненного контекста главного окна (SC).
В этом посте() мы попытались запланировать выполнение метода дочернего окна.
В половине случаев это срабатывает. в другой половине ничего не происходит. Если ничего не происходит, я нажимаю кнопку избыточности в главном окне и тем самым вызываю другую избыточную функцию Post() с "пустым" делегатом.
В результате выполняются все ранее запланированные делегаты и, наконец, последний “пустой” делегат.
Первоначально я думал, что контекст синхронизации (SC) еще никак не инициализирован. Но, видимо, это не так, так как работает самый первый Post ().
Вторая мысль состояла в том, что что-то не было инициализировано в объекте, на который ссылается делегат. Но это также странно, потому что его конструктор завершен.
Я был бы очень рад, если бы кто-нибудь прояснил ситуацию и дал мне совет, как это исправить.
Что я уже пробовал:
Нужна помощь в решении проблемы с SynchronizationContext
Gerry Schmitz
Попробуйте сначала сделать это синхронно. Неоправданная сложность? Может быть, вам нужно "делать события" после каждого поста. Контекст синхронизации ленив, говорят документы.