Возьми с полки SynchronizationContext и не придумывай себе проблемы.
Последовательность такая:
1. Из главного потока после создания формы сохраняем SynchronizationContext.Current куда-нибудь
2. Из другого потока вызываем на нем Send().
Работать будет без привязки к конкретным формам, пока главный поток свободен (ЕМНИП, это даже работает для WaitHandle.Wait()).
Здравствуйте, Real 3L0, Вы писали:
R3>И теперь опять при закрытии формы зависаю на EndInvoke. Что не так?
Вызванный через BeginInvoke метод попадает в очередь сообщений формы. А при закрытии форма перестает обрабатывать сообщения из очереди. Т.е. ожидание нельзя делать принудительным, если форма закрывается. Мне кажется, что даже свойство Disposing тут отслеживать слишком поздно. Т.е. если в текущий момент форма еще не Disposing, то не факт, что BeginInvoke успеет на паровоз закрытия формы, т.к. не-UI поток может подзаснуть и проспать закрытие.
И тут дело не в форме Invoke/SynchronizationContext/await async...
Пока возврат метода не требовался, видимо, выполнение его никак не контролировалось. С необходимостью получить возврат, оказалось, что гарантий выполнения никто дать не может.
Здравствуйте, Quebecois, Вы писали:
Q>Возьми с полки SynchronizationContext и не придумывай себе проблемы.
Пробую разобраться.
Читаю https://habr.com/ru/post/232169/
Пример из статьи, содержащий "mToolStripButtonThreads_Click" в отдельном проекте работает вообще без изменений.
А пытаюсь занести себе в проект и какой-то шантан:
1.
В параметрах uiContext.Post требуется UpdateUI, возвращающий результат SendOrPostCallback
2.
Если указать, как в предыдущем пункте, то метод UpdateUI, продолжает выполняться в том же потоке, откуда он и вызван.
Проекты в обоих случаях одинаковые: Net 5.0.
Как такое возможно?
Здравствуйте, samius, Вы писали:
S>И тут дело не в форме Invoke/SynchronizationContext/await async... S>Пока возврат метода не требовался, видимо, выполнение его никак не контролировалось. С необходимостью получить возврат, оказалось, что гарантий выполнения никто дать не может.
Т.е. ты намекаешь на то, что можно оставить как есть, но при закрытии формы не давать её закрывать, пока не погашу все потоки?
R3>Пробую разобраться. R3>Читаю https://habr.com/ru/post/232169/ R3>Пример из статьи, содержащий "mToolStripButtonThreads_Click" в отдельном проекте работает вообще без изменений. R3>А пытаюсь занести себе в проект и какой-то шантан: R3>1. R3>В параметрах uiContext.Post требуется UpdateUI, возвращающий результат SendOrPostCallback
R3>2. R3>Если указать, как в предыдущем пункте, то метод UpdateUI, продолжает выполняться в том же потоке, откуда он и вызван.
...
И даже не виснет при закрытии.
И методы стали не обёрнутые Invoke'ами.
...
А из-за того, что методы не обёрнутые, то можно дёргать любые методы и возможность передачи значений между ними появилась автоматом.
Здравствуйте, Real 3L0, Вы писали:
R3>Здравствуйте, samius, Вы писали:
S>>И тут дело не в форме Invoke/SynchronizationContext/await async... S>>Пока возврат метода не требовался, видимо, выполнение его никак не контролировалось. С необходимостью получить возврат, оказалось, что гарантий выполнения никто дать не может.
R3>Т.е. ты намекаешь на то, что можно оставить как есть, но при закрытии формы не давать её закрывать, пока не погашу все потоки?
нет, я на такое не намекал. Я намекал на то, что потоки могут не получить возвраты из UI, т.к. форма уже закрыта. И сделать ситуацию контроллируемой можно лишь тем, что форма, закрываясь, будет отменять все вычисления, данные ей. Можно сделать через Task_и их Source-ы.
Здравствуйте, samius, Вы писали:
S>нет, я на такое не намекал. Я намекал на то, что потоки могут не получить возвраты из UI, т.к. форма уже закрыта. И сделать ситуацию контроллируемой можно лишь тем, что форма, закрываясь, будет отменять все вычисления, данные ей. Можно сделать через Task_и их Source-ы.
У меня так и было сделано: при закрытии формы инициировал и ждал
R3>И процесс зависал.
Надо таски отменять через TaskCompletionSource при закрытии формы. Если метод выполнения таска не получил управления, Wait будет бесконечным.
Здравствуйте, samius, Вы писали:
S>Надо таски отменять через TaskCompletionSource при закрытии формы. Если метод выполнения таска не получил управления, Wait будет бесконечным.