Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Если асинхронные вызовы все равно выполнаются в текущей нитке, в чем глубокий смысл?
Работаю с несколькими чужими веб проектами где везде суют асинхронное исполнение. Накой? Все равно браузеру ждать ответа.
6 мар 18, 21:32    [21241871]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Чтобы не быть голословным, вот например такой метод:

private static async Task WriteSimpleAttribute(XmlWriter xmlWriter, string name, string value)
{
  await xmlWriter.WriteStartElementAsync(null, "attribute", null);
  await xmlWriter.WriteAttributeStringAsync(null, "name", null, name);
  await xmlWriter.WriteStartElementAsync(null, "attributeValues", null);
  await xmlWriter.WriteStartElementAsync(null, "attributeValue", null);
  await xmlWriter.WriteElementStringAsync(null, "value", null, value);
  await xmlWriter.WriteEndElementAsync();
  await xmlWriter.WriteEndElementAsync();
  await xmlWriter.WriteEndElementAsync();
}

И чё мы выиграли?
6 мар 18, 21:42    [21241889]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
mayton
Member

Откуда: loopback
Сообщений: 37937
Gobzo Kobler, похоже по коду внутри идет работа с I/O.

А ты напиши перформанс-тест для двух вариантов. Асинхронный. И обычный. И сравни.
7 мар 18, 01:21    [21242130]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Gobzo Kobler
Если асинхронные вызовы все равно выполнаются в текущей нитке, в чем глубокий смысл?


IO операции выполняются в так называемом "IO потоке" (условно), пока они там выполняются, поток освобождается и может выполнять другую работу, т.е. не простаивает, ожидая пока IO операция будет завершена, тем самым отнимая драгоценный ресурс у приложения.

И нет, синхронный код асинхронного метода выполняется не в текущей нитке, а в первом свободном потоке (см. ConfigureAwait, чтобы этим управлять).

Gobzo Kobler
Работаю с несколькими чужими веб проектами где везде суют асинхронное исполнение. Накой? Все равно браузеру ждать ответа.


Мы уже давно перешли на асинхронную модель. Был опыт, когда существующее старенькое приложение под внезапно выросшими высокими нагрузками в качестве эксперимента переделали на асинхронную модель и получили колоссальный выигрыш по производительности, исчезли периодические DOS, без применения техник масштабирования (горизонтального и вертикального) и без хак-тюнинга.

А «Все равно браузеру ждать ответа» это верно, быстрее работа с СУБД или файлами от этого не станет, но драгоценные ресурсы при этом экономятся. Т.е. другими словами, клиенты не ждут, когда освободится поток, который тупо ждёт когда там база данных раздуплится.

Gobzo Kobler
И чё мы выиграли?


В данном случае мы видим, что мы пишем в XmlWriter, но маленькими порциями, это не значит, что все эти операции обязательно будут I/O операциями, данные пишутся в буффер, когда буффер наполнится, он скидывается на диск, и только в этот момент происходит I/O операция, которую не хотелось бы ждать и блокировать поток. Проблема в том, что мы не знаем КОГДА этот буфер наполнится, а управлять буффером вручную не хотелось бы. Поэтому ВСЕ эти маленькие операции должны выполняться с помощью конструкций асинхронного вызова.

Фишка в том, что ты не можешь в методе, который был вызван синхронно (т.е. без await), выполнить асинхронный вызов через await когда тебе вздумается, и чтобы это имело под собой обозначенный профит. Нет, не можешь. Поэтому ВЕСЬ код, который собирается выполнять I/O операции хоть где-то, должен быть async. Конечно, ты можешь в любой момент вернуться с одной из старых моделей для асинхронных вызовов, от чего как раз все уходят. На событиях, делегатах, специальных интерфейсах :)

Модератор: Тема перенесена из форума "Программирование".
7 мар 18, 01:46    [21242139]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
Gobzo Kobler,
Код действительно некрасивый.
Нужно делать асинронным сам объект.
7 мар 18, 08:01    [21242287]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Petro123
Код действительно некрасивый.
Нужно делать асинронным сам объект.


Что некрасивого? Можно прокидывать делегат с синхронным кодом внутрь асинхронного, но нафига эти костыли?
7 мар 18, 10:40    [21242589]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
hVostt
Что некрасивого?

На каждой строке писать await.
Нужно без этого слова но асинхронно.
7 мар 18, 10:45    [21242608]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1710
>Gobzo Kobler, вчера, 21:42 [21241889]
>
>И чё мы выиграли?
В классе с Вашим примером могут существовать методы обработки событий, что дает возможность прервать работу метода Вашего примера, к примеру.
7 мар 18, 10:53    [21242634]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
ВМоисеев
могут

И В синхронном коде можно прерывать метод.
7 мар 18, 11:00    [21242645]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Petro123
Нужно без этого слова но асинхронно.


код в студию
7 мар 18, 13:15    [21243091]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
ВМоисеев
В классе с Вашим примером могут существовать методы обработки событий, что дает возможность прервать работу метода Вашего примера, к примеру.


не могут, не передаётся CancellationToken
7 мар 18, 13:15    [21243092]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
hVostt
Petro123
Нужно без этого слова но асинхронно.


код в студию

Он тот же без слов await в каждой строке.
Сам класс xmlWriter внутри накапливает в буфер и другим потоком выполняет.
Т.е. 15 строк пробегут мгновенно.
Больше ничего не надо. Всё внутри xmlWriter.
7 мар 18, 16:03    [21243641]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
Какую-такую "другую работу"? Обрабатывается HTTP запрос, ему нужен XML созданный обработчиками. Что еще он может "делать" пока создается XML по кусочкам?
7 мар 18, 17:51    [21243833]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
Gobzo Kobler,
В данном случае ты прав.
7 мар 18, 18:24    [21243894]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
[quot hVostt]
Gobzo Kobler
В данном случае мы видим, что мы пишем в XmlWriter, но маленькими порциями, это не значит, что все эти операции обязательно будут I/O операциями, данные пишутся в буффер, когда буффер наполнится, он скидывается на диск.

Не на диск, а в Response.
7 мар 18, 19:03    [21243943]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Petro123
Он тот же без слов await в каждой строке.
Сам класс xmlWriter внутри накапливает в буфер и другим потоком выполняет.
Т.е. 15 строк пробегут мгновенно.
Больше ничего не надо. Всё внутри xmlWriter.


угу, вместо одного, ты два потока сожрёшь. ясно
7 мар 18, 20:09    [21244015]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Gobzo Kobler
Какую-такую "другую работу"? Обрабатывается HTTP запрос, ему нужен XML созданный обработчиками. Что еще он может "делать" пока создается XML по кусочкам?


обрабатывать другие запросы, вот что делать.
7 мар 18, 20:09    [21244016]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Gobzo Kobler
Не на диск, а в Response.


запись в респонз тоже можно делать асинхронно, т.е. для того, чтобы скидывать данные из буфера в сеть поток не нужен.
7 мар 18, 20:10    [21244018]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
hVostt,

ты хочешь сказать что все запросы обрабатываются одним потоком?
7 мар 18, 20:15    [21244035]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
hVostt
Member

Откуда:
Сообщений: 14974
Gobzo Kobler
hVostt,

ты хочешь сказать что все запросы обрабатываются одним потоком?


все запросы обрабатываются ограниченным набором потоков из пула потоков. основная задача, это заставить имеющиеся потоки выполнять работу, а не проводить время в ожидании IO операций, и уменьшать количество задействованных потоков.
7 мар 18, 20:20    [21244038]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
hVostt,

понятно, все на подпорках.

https://msdn.microsoft.com/en-us/library/hh191443.aspx
Async methods don't require multithreading because an async method doesn't run on its own thread.


а следовательно HttpRequest и XmlWriter, поддержанные "в заду" MemoryStream, все равно в моем примере будут полоть процессор и никакого выигрыша от асинхронности не будет. по моему все таки разрабам надо думать головой, а не тухесом и отличать ожидание ответа накопителя или сетевого адаптера от пересылки байтов из буфера в буфер.
7 мар 18, 20:38    [21244060]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Gobzo Kobler
Member

Откуда: у людей такая фантазия?
Сообщений: 387
+под процессором следует понимать одно ядро!
7 мар 18, 20:38    [21244061]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
hVostt
обрабатывать другие запросы, вот что делать.

это забота другого уровня. Причём тут прикладной код?
Веб сервер, если идёт запрос и нет свободного потока запускает новый).
Ты тут со своим кодом причём?
7 мар 18, 21:15    [21244096]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
Petro123
Member

Откуда: Загрузочный сектор Москвы (AutoPOI.ru)
Сообщений: 35688
Gobzo Kobler
а следовательно HttpRequest и XmlWriter, поддержанные "в заду" MemoryStream, все равно в моем примере будут полоть процессор и никакого выигрыша от асинхронности не будет. по моему все таки разрабам надо думать головой, а не тухесом и отличать ожидание ответа накопителя или сетевого адаптера от пересылки байтов из буфера в буфер.

совершенно верно.
Простота написания await в Net оглупляет народ.
В Java поток создать посложнее, поэтому народ не пишет await направо и налево.
7 мар 18, 21:18    [21244100]     Ответить | Цитировать Сообщить модератору
 Re: Асинхронное программирование под .NET - в чем глубокий смысл?  [new]
ВМоисеев
Member

Откуда: Редкино
Сообщений: 1710
>hVostt, вчера, 13:15 [21243092]
>не могут,...
Если ...async Task... есть метод UserControl, то Вы считаете, что нельзя удалить uc, вызвав Children.Remove(uc) в обработчике Click?
8 мар 18, 01:03    [21244449]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить