История изменений
Исправление den73, (текущая версия) :
И забываем об этом, ничего не замораживаем.
Это, если я правильно знаю термин, требует переписывания всего кода в continuation passing style. Конкретно у меня отладчик, в нём стек. В принципе система может рухнуть при открытии любого кадра стека, поэтому открывать их все сразу не совсем хорошо.
Когда пользователь начинает поиск, я делаю следующую последовательность действий:
a1 получить данные о локалах первого кадра стека с сервера a2 заселить ноду дерева a3 искать в этой ноде a4 если нашли, встать туда. a5 если не нашли - повторить для следующихТо же самое, если я просто хочу открыть ноду, то:
b1 получить данные о локалах первого кадра стека с сервера b2 заселить ноду дерева b3 развернуть нодуНачнём с того, что если b1 асинхронен, то сценарий b вообще может сломаться. По хорошему я должен перебить открытие ноды и сделать его асинхронным. Тогда сломается любой код, предполагающий открытие ноды синхронным:
c1 открыть ноду # c2 фактически произойдёт до раскрытия ноды c2 сделать ещё-что-тоЭтот код должен быть изменён. Но я не имею доступа к перечню этого кода, поскольку он может быть внутри самой реализации tablelist. В документации не задекларирован механизм асинхронного раскрытия ноды (хотя весь мануал я не осилил, но думаю, что всё же там этого нет).
Далее, при асинхронности я должен пп 2-5 завернуть в continuation и повесить его на возврат события из п.1. Я не говорю о том, что такой код сложнее. Начинаются ещё и чудеса, когда накладываются друг на друга сценарии a и b.
Так что пока на вид у меня всё работает, но по факту это иллюзия. Ситуация выглядит слегка тупиковой, единственный выход - отказ от асинхронности.
Исходная версия den73, :
И забываем об этом, ничего не замораживаем.
Это, если я правильно знаю термин, требует переписывания всего кода в continuation passing style. Конкретно у меня отладчик, в нём стек. В принципе система может рухнуть при открытии любого кадра стека, поэтому открывать их все сразу не совсем хорошо.
Когда пользователь начинает поиск, я делаю следующую последовательность действий:
a1 получить данные о локалах первого кадра стека с сервера a2 заселить ноду дерева a3 искать в этой ноде a4 если нашли, встать туда. a5 если не нашли - повторить для следующихТо же самое, если я просто хочу открыть ноду, то:
b1 получить данные о локалах первого кадра стека с сервера b2 заселить ноду дерева b3 развернуть нодуНачнём с того, что если b1 асинхронен, то сценарий b вообще может сломаться. По хорошему я должен перебить открытие ноды и сделать его асинхронным. Тогда сломается любой код, предполагающий открытие ноды синхронным:
c1 открыть ноду # c2 фактически произойдёт до раскрытия ноды c2 сделать ещё-что-тоЭтот код должен быть изменён. Но я не имею доступа к перечню этого кода, поскольку он может быть внутри самой реализации tablelist. В документации не задекларирован механизм асинхронного раскрытия ноды.
Далее, при асинхронности я должен пп 2-5 завернуть в continuation и повесить его на возврат события из п.1. Я не говорю о том, что такой код сложнее. Начинаются ещё и чудеса, когда накладываются друг на друга сценарии a и b.
Так что пока на вид у меня всё работает, но по факту это иллюзия. Ситуация выглядит слегка тупиковой, единственный выход - отказ от асинхронности.