Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.76/29: Рейтинг темы: голосов - 29, средняя оценка - 4.76
 Аватар для NapalmRain
44 / 43 / 7
Регистрация: 18.05.2010
Сообщений: 688
.NET 4.x

Запуск события из фонового потока для взаимодействия с основным

16.08.2019, 10:00. Показов 6008. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени суток!

У меня есть некий класс, у него есть событие, на него подписано какое-то количество других классов.
Эти самые слушатели должны взаимодействовать по результатам события с UI, то есть что-то отображать на морде программы.

Класс же, который это событие возбуждает работает в фоновом потоке, там потенциально бесконечный цикл крутится и иногда должен сообщать о том, что у него что-то произошло.

С принципом работы событий я только начал разбираться по человечески, но к сожалению на этот гипотетический вопрос не смог найти ответа по интернетам.

Буду признателен за любой совет!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.08.2019, 10:00
Ответы с готовыми решениями:

Вызов основного потока из фонового
Добрый день! Нужно выполнить некий код в отдельном потоке. По завершению выполнения, необходимо вызвать новую форму из ГЛАВНОГО...

Шаг ProgressBar не из фонового потока
Можно ли каким-то образом сделать шаг в ProgressBar'e если он создан в фоновом потоке, а я хочу вызвать функцию шага в другом потоке, можно...

Создание простейшего прелоадера при заполнении списка из фонового потока
Доброго всем времени суток! Задача, как мне кажется, для ну уж совсем новичков, но я, по непонятной мне причине, не смог найти вообще...

31
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,752
21.08.2019, 07:49
Студворк — интернет-сервис помощи студентам
amr-now, речь не о том где выполнится задача в await, а в том, что будет в это время с методом в котором этот await присутствует. А будет только одно: метод не будет исполняться, пока задача в await не завершится. Параллельное же исполнение не заставляет метод ожидать окончания запущенной задачи.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
21.08.2019, 07:55
Цитата Сообщение от Usaga Посмотреть сообщение
в том, что будет в это время с методом в котором этот await присутствует
Вы всего лишь описали назначение ключевого слова await. Для этого его и придумали практически в муках (и большой коллектив явно талантливых людей).
Да, строится очень сложный конечный автомат.
Параллельное исполнение очень жестко подразумевает исполнение в другом thread.
Асинхронность (конкурентность) в этом смысле не прибита гвоздями к thread.
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,752
21.08.2019, 09:17
amr-now, так я и не говорил, что прибита.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
21.08.2019, 13:09
Цитата Сообщение от Usaga Посмотреть сообщение
Да. Просто запускается поток. Код в этом методе не будет дожидаться завершения этого потока. Это параллельность, не асинхронность.
Вы назвали метод, который гарантированно выполняется в 1 потоке, параллельным. Ваша терминология - мутная .
Цитата Сообщение от Usaga Посмотреть сообщение
Никакой ошибки. Асинхронный код не параллельный.
Одно другому не мешает.
Цитата Сообщение от amr-now Посмотреть сообщение
Товарищи, я единственный не вижу разницы между двумя методами?
Назначение первого метода - вывести строку текста. Когда этот метод возвращает управление, нет гарантий, что строка уже выведена. Поэтому я назвал его асинхронным.

Назначение второго метода - создать "горячую" таску. Когда этот метод возвращает управление, есть гарантия, что эта задача уже создана. Поэтому я назвал его синхронным.

По-моему всё просто. Я рассматриваю код на одном уровне абстракции, а не лезу к ему под капот.
Если лезть под капот, то можно более сложные картины наблюдать: одни операции выполняются синхронно, другие асинхронно, третьи параллельно, но после того как дождутся выполнения первой асинхронной операция, причем не дожидаясь второй асинхронной и тд.

Зачем вызывающему знать про синхронность/асинхронность метода? Чтобы, например, писать такой код:
C#
1
2
WriteString();
Console.WriteLine("Была выведена некоторая строка");
Или такой:
C#
1
2
WriteString();
Console.WriteLine("Некоторая строка была или будет выведена");
Причем первый вариант нельзя использовать, если WriteString обладает свойством асинхронности. То есть имеет хоть малейший шанс вернуть управление до вывода своей строки.
Цитата Сообщение от Usaga Посмотреть сообщение
Не обратил внимание на TaskScheduler.FromCurrentSynchronization Context(). Лямбда выполнится в текущем потоке ПОСЛЕ того как завершится обработчик метода.
Я знаю когда что выполнится. Вы дайте ответ на вопрос об асинхронности этого метода. Судя по вашему определению, он не является асинхронным, но и гарантии, которые дает синхронный код, он тоже не предоставляет. Может, из практических соображений, вы измените свое определение асинхронности?
0
Эксперт .NET
 Аватар для Usaga
14371 / 9478 / 1360
Регистрация: 21.01.2016
Сообщений: 35,752
21.08.2019, 13:19
Цитата Сообщение от TopLayer Посмотреть сообщение
Вы назвали метод, который гарантированно выполняется в 1 потоке, параллельным. Ваша терминология - мутная
Я не сразу увидел настройку для шедулера. Я потом на это указал.

Цитата Сообщение от TopLayer Посмотреть сообщение
Одно другому не мешает.
Метод либо асинхронный, либо он в параллель с задачами запускаемыми работает. И код метода и запущенная задача одновременно не выполняются. Действительно одно другому не мешает.

Цитата Сообщение от TopLayer Посмотреть сообщение
Назначение первого метода - вывести строку текста. Когда этот метод возвращает управление, нет гарантий, что строка уже выведена. Поэтому я назвал его асинхронным.
Назначение второго метода - создать "горячую" таску. Когда этот метод возвращает управление, есть гарантия, что эта задача уже создана. Поэтому я назвал его синхронным.
У вас два метода идентичны и только названием отличаются) Вопрос был именно об этом)

Цитата Сообщение от TopLayer Посмотреть сообщение
Я знаю когда что выполнится. Вы дайте ответ на вопрос об асинхронности этого метода. Судя по вашему определению, он не является асинхронным, но и гарантии, которые дает синхронный код, он тоже не предоставляет. Может, из практических соображений, вы измените свое определение асинхронности?
Этот метод не асинхронный. Всё, что он гарантирует - что лямбда выполнится в этом же потоке, но уже после этого метода и бог знает когда.
0
548 / 355 / 120
Регистрация: 17.08.2014
Сообщений: 1,351
21.08.2019, 13:33
А как сделать так чтобы метод запустился и когда он отработает уже параллельно, главное чтобы отработал быстро. Типо рассылки одного пакета по всем адресатам.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
21.08.2019, 14:14
Usaga, https://en.wikipedia.org/wiki/... rogramming)
Asynchrony, in computer programming, refers to the occurrence of events independent of the main program flow and ways to deal with such events. These may be "outside" events such as the arrival of signals, or actions instigated by a program that take place concurrently with program execution, without the program blocking to wait for results.
И что я сразу не догадался загуглить определение
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
21.08.2019, 14:23
TopLayer, гуглоперевод доставляет.
Обычный способ борьбы с асинхронностью
Да-да. Именно этим мы и занимаемся

Добавлено через 2 минуты
----
Хотя в английской Википедии определение явно плохое и не соответствует описанию ситуации.
0
907 / 664 / 318
Регистрация: 23.10.2016
Сообщений: 1,543
21.08.2019, 14:27
Цитата Сообщение от amr-now Посмотреть сообщение
Хотя в английской Википедии определение явно плохое и не соответствует описанию ситуации.
Поясните
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
21.08.2019, 15:49
Что-то нашел.
C# 6.0
IN A NUTSHELL
Joseph Albahari & Ben Albahari
What is Asynchronous Programming?
The principle of asynchronous programming is that you write long-running (or potentially long-running) functions asynchronously. This is in contrast to the conventional approach of writing long-running functions synchronously and then calling those functions from a new thread or task to introduce concurrency as required.
The difference with the asynchronous approach is that concurrency is initiated inside the long-running function, rather than from outside the function.
То есть по мнению Албахари примерно так: конкурентность = параллелизм + асинхронность.

Есть "long-running function" - "рабочий код".
И есть авианосец, с которого взлетает этот "рабочий код".
В new Thread() и в Task.Run() мы этот авианосец расписываем в открытом виде, пиная рабочий код в отдельный thread.
А с помощью await мы запускач "рабочего кода" тщательно маскируем.

Но это всё равно не совсем полное определение. Потому что существует Event-based Asynchronous Pattern, который обходится без await. И при этом он истинно асинхронный в самом догматическом понимании.

Добавлено через 11 минут
----
Грубо говоря, общая проблема в наши дни не в определении формулировки.
А в том, что "рабочий код" возвращает единственный результат и генерит единственное событие своего завершения, на которое подписывается await.
Второй вариант - есть гипотетическая цепочка событий, состоящая из конечного числа элементов (что-то где то завершилось или вернуло результат).
Третий вариант - гипотетическая цепочка событий, состоящая из бесконечного числа элементов, не планирующая никогда по своей воле завершаться.
Вот как раз третью цепочку целиком не дождешься. Два предыдущих варианта полностью дождаться можно.

Добавлено через 12 минут
-----------
Показали пример, что на событие завершения Task можно повесить несколько подписчиков. Прикольно.
А await приспособлен для единственного подписчика.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,236
21.08.2019, 19:58
Цитата Сообщение от amr-now Посмотреть сообщение
конкурентность = параллелизм + асинхронность.
Не, мне кажется не так, concurrency с англ. - и есть параллельность, параллелизм.
Асинхронность - отсутствие ожидания = то есть это либо синхронное выполнение (если кусок логики достаточно короткий) + либо параллельное, если задача действительно занимает поток на достаточное долгое время , а нам нельзя по каким-то причинам его долго занимать на эту задачу
is that concurrency is initiated inside the long-running function
Добавлено через 1 минуту
Если авианосцу плыть достаточно близко, то он сам поплывет, если далеко, то он пнет какой-нибудь истребитель.
Лично я так вижу эту картину, надо как-нибудь поглубже покопаться в TPL, чтобы уж действительно в деталях.
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
21.08.2019, 21:26
На Хабре спрашивают: "А почему в рунете отсутствует формулировка конкурентности?"
Ответ: "Да просто забили. Не надо никому было."
Хотя буржуи очень даже отличают конкурентность от параллелизма.
https://wiki.haskell.org/Paral... oncurrency

Хотя интересная картина маслом, оказывается можно использовать технологию, в принципе никак её не называя.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.08.2019, 21:26

Получение значения из фонового потока и передача его в главный поток
как получить значение из фонового потока и передать его в главный поток?Знаю что метод должен быть только void...

Запуск потока для функции с параметрами
Доброго дня! Что хочется: распараллелить выполнение процедуры func. Давая новым потокам соответствующие параметры. На c# я...

Способ вызова из фонового потока метода, но чтобы последний выполнялся в главном потоке
Есть два потока: главный и фоновый. Ищу способ вызова из фонового потока метода, но чтобы последний выполнялся в главном потоке. ...

Запуск Process: Операция асинхронного чтения для потока уже запущена
Здравствуйте Программа такая есть кнопка и есть textbox при нажатии на кнопку выполняется вызов ipconfig , читается вывод который...

Реализуйте запуск потока для последовательного счета, начиная с заданного числа
Доброго времени суток Задание такое: Реализуйте запуск потока для последовательного счета начиная с заданного числа (создать функцию ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru