|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||||||||||||||||
Синхронизация метода в событии17.02.2022, 20:06. Показов 3492. Ответов 70
Метки нет (Все метки)
Проблема 1
Подписался я на какое-то событие. По подписке хочу запускать задачи, но по мере их выполнения.
Проблема 2 Есть какой-то конструктор, в которм такая же проблема:
Как бы по-уму подойти к этим ситуациям и что мне неизвестно в глубинках Net? Да и уместно ли прикрутить к этому .GetAwaiter()?
0
|
||||||||||||||||
| 17.02.2022, 20:06 | |
|
Ответы с готовыми решениями:
70
Синхронизация потоков - уведомление о событии
Синхронизация метода(пример из книги Г. Шилдт)очерёдность вывода результата не такая как в главном потоке |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 18.02.2022, 16:33 | |||
|
1
|
|||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||
| 18.02.2022, 16:44 | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|
| 18.02.2022, 17:59 | |
|
Fylhtq05, я ничего не говорил про ConfigureAwait - он обычно и используется для решения подобных проблем.
2
|
|
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|
| 18.02.2022, 18:22 | |
|
kolorotur, т.е. если нет статического конструктора, в котором асинхронно вызывается статический метод и во всех случаях стоит АсинхронныйМетод.ConfigureAwait(false).W ait();, то больше никаких неприятностей, связанных с Wait(), нет? Т.е. если нет статического конструктора, то отличие Wait() от await, только в контексте, который решается ConfigureAwait(false)?
0
|
|
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|
| 18.02.2022, 19:28 | |
|
Элд Хасп, можете привести пример, чтобы не было статического конструктора, вызывающего асинхронно статический метод, но были бы зависания из-за Wait(), несмотря на применение ConfigureAwait, которые бы исчезали при модификации кода для замены Wait() на await.
0
|
|
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|
| 18.02.2022, 20:07 | |
|
Элд Хасп, что такое Dispatcher?
ConfigureAwait не помогает, а замена на await решает проблему?
0
|
|
|
Модератор
|
||||
| 18.02.2022, 20:19 | ||||
|
Используется для доступа к UI элементам из других потоков. То есть до него исполнение даже не доходит.
1
|
||||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||
| 18.02.2022, 20:25 | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||||||||||||||||
| 18.02.2022, 20:29 | |||||||||||||||||
|
Вот более реалистичный пример. Ниже метод из сторонней сборки, который изменить нельзя:
3
|
|||||||||||||||||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
|
| 18.02.2022, 20:46 | |
|
kolorotur, то что без await сначала выводится "Второе" - так и должно быть. Wait() здесь можно применить? Если нельзя, почему (что-то связано с тем, что метод в dll и потому опять какие-то особенности языка?)?
0
|
|
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 18.02.2022, 20:57 | |||
|
Где же это видано, чтобы первое было после второго?! Надо только добавить кнопку в окошко и привязать к ней обработчик Button_Click. С DLL связано только то, что вы этот метод не можете изменить — его уже за вас написал другой разработчик. Ну, чтобы соблазна не было
2
|
|||
|
1182 / 624 / 160
Регистрация: 19.04.2018
Сообщений: 2,923
|
||
| 18.02.2022, 21:00 [ТС] | ||
Хорошо. Разобрался что делает .ConfigureAwait(false). Где я могу это применить? Опять же: на примере WPF проекта. Как я понимаю это точно не слой View/ViewModel. Видимо где-то в Model.
0
|
||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||
| 18.02.2022, 21:05 | ||
|
0
|
||
|
Модератор
|
|||
| 18.02.2022, 21:47 | |||
|
Если использовать его в формах подробным же образом, думаю, там тоже будет взаимоблокировка. Чтобы не загружать UI поток исполнением большого кода, он передаётся в задачу. Но по какой-то причине есть необходимость дождаться завершения исполнения этого кода. Поэтому ставится Wait. Но в самом коде тоже может быть обращение к UI элементам. Для этого приходится это делать через марщалинг в UI поток. Поток начнёт исполнять маршалируемле действие, когда освободится. Но он не может освободиться пока не завершится задача. В общем случае, вы не знаете, что есть в асинхронном методе. Есть там маршалинг в UI поток или нет. Вам известно только что он возвращает задачу (Task). Если вы ожидаете эту задачу через await, то никаких проблем не будет. А вот если ожидаете через Wait - возможны нюансы, о которых вы узнаете только косвенно по зависания приложения. И вы даже понять не сможете, может это метод так долго работает, может в нём ошибка какая-то? То что это взаимоблокировка может даже в голову не прийти.
2
|
|||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||
| 18.02.2022, 21:47 | ||||||
Сообщение было отмечено limeniye как решение
РешениеЭто устраняет массу багов с теми же зависаниями и делает приложение более шустрым. Да и какая разница что там внутри происходит? Вы же когда вызываете какой-нибудь асинхронный метод из .NET — всегда его ждете через await, а не лезете в исходники проверять что там да как. Пусть там будет не Task.Delay, а DownloadVeryImportantDataWithoutWhichWeC annotContinueAsync — не суть важно. Допустим, продолжение второго метода зависит от завершения первого метода. Если первый метод скачивает что-нибудь с интернета, с чем второму методу надо потом работать.
3
|
||||||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||
| 18.02.2022, 22:22 | ||
|
0
|
||
|
Модератор
|
||
| 18.02.2022, 22:42 | ||
|
Он, вообще, не имеет никакого отношения к блокировке. ОН может повлиять, допустим, на исключения в коде выполняющимся ПОСЛЕ завершения задачи.
0
|
||
|
109 / 52 / 16
Регистрация: 09.06.2021
Сообщений: 480
|
||
| 18.02.2022, 23:00 | ||
|
0
|
||
| 18.02.2022, 23:00 | |
|
Помогаю со студенческими работами здесь
60
Невозможно передать ArrayList в аргументы метода без модификатора static у этого метода или метода main Модуль EVO II синхронизация 50гц, На какой ножке контроллера синхронизация шим двигателя? Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода Комбинирование метода половинного деления, метода хорд и метода касательных
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром.
возможно получится прикрутить интерпретатор питон для кастомизации игровой логики.
что есть на текущий момент:. . .
|
|
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2.
Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
|
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
|
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2.
Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
|
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2.
Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом.
В. . .
|