|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Ведь все асинхронные методы можно вызывать синхронно и от старых API не убудет. Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом? Единственное, я не понял, если запустить код с ключевым словом async на старом фреймворке - 3, 3.5 там, он не выдаст ли ошибку, что такого ключевого слова нет, и не не захочет ли компилироваться? Просто смотрю, щас некоторые API (например, генератор прокси-классов для WCF) по-умолчанию создают пару async-не async методов. Скоро, видать, вообще только асинки генерить будут. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 04:31 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42Скоро, видать, вообще только асинки генерить будут. Не будут. Асинхронность не бесплатна. Использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность. У большинства классов она гарантирована только статическим методам, исключение классы Concurrent* Тормоза из-за синхронизации получаются значительные. Затести например скорость работы Dictionary<> и ConcurrentDictionary<> ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 07:06 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dima T Одновременное использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность.Добавил. Описанная ситуация с асинхронным кодом случается не чаще чем с синхронным. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 08:55 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Алексей КDima T Одновременное использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность.Добавил. Описанная ситуация с асинхронным кодом случается не чаще чем с синхронным. Описанная ситуация в синхронном коде отработает корректно, а в асинхронном могут случиться "мистические явления", источник которых устанешь потом искать, т.к. повторно воспроизвести их очень проблематично. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 09:05 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dima TАлексей Кпропущено... Добавил. Описанная ситуация с асинхронным кодом случается не чаще чем с синхронным. Описанная ситуация в синхронном коде отработает корректно, а в асинхронном могут случиться "мистические явления", источник которых устанешь потом искать, т.к. повторно воспроизвести их очень проблематично.Ну давай вместе составим список особенностей, связанных с тем, что продолжение асинхронной операции может производиться в другом потоке: 1. Невозможность использования ThreadStatic полей. Что ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 09:12 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо.Например, если внутри асинхронного метода есть продолжения, синхронизированные с UI-потоком (WPF, WinForms), и ты синхронно ожидаешь окончания этого метода в UI-потоке, то будет мёртвая блокировка. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 09:18 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Алексей КЧто ещё? Простой пример многопоточного использования непотокобезопасного кода Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22.
подумай сколько будет в итоге, потом сравни с ответом под спойлером запускал несколько раз в консоли Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Я про такую мистику многопоточности говорил ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 09:42 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dima TАлексей КЧто ещё? Простой пример многопоточного использования непотокобезопасного кодаНе надо путать многопоточность и асинхронность. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 09:45 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Алексей КНе надо путать многопоточность и асинхронность. я не путаю, асинхронности без использования многопоточности не бывает. А если начать ее использовать так Dude42Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом? то описанные мною грабли рано или поздно сработают. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 10:07 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42 Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом? Всегда надо думать и понимать что делаешь, а иначе не видать удачи. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 10:15 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dima TАлексей КНе надо путать многопоточность и асинхронность. я не путаю,Путаешь. Асинхронность не подразумевает одновременное обращение из разных потоков к параметрам и результатам асинхронного метода. Dima Tасинхронности без использования многопоточности не бывает.Бывает. Можно в Task обернуть отправку операции в UI-очередь через Dispatcher.BeginInvoke. При этом, не смотря на асинхронность, всё будет выполняться в одном UI-потоке. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 10:56 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Алексей К, в node.js есть асинхронность но нет многопоточности ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 11:10 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
ЕвгенийВАлексей К, в node.js есть асинхронность но нет многопоточностиКак и в обычном "браузерном" JavaScript. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 12:31 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Алексей ККак и в обычном "браузерном" JavaScript. Ну.... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.06.2016, 15:18 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dima TDude42Скоро, видать, вообще только асинки генерить будут. Не будут. Асинхронность не бесплатна. Использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность. У большинства классов она гарантирована только статическим методам, исключение классы Concurrent* Тормоза из-за синхронизации получаются значительные. Затести например скорость работы Dictionary<> и ConcurrentDictionary<> Вы не поняли. Я имел ввиду, что просто все методы делать async, вне зависимости от их потокобезопасности, а будет ли пользователь их применять сихнронно или асинхронно - его дело. В комментариях а API, конечно, упоминать, что этот де метод потокобезопасен, а этот - нет. Само слово async, вроде, ниде в C# не гарантирует потокобезопасность, а всего лишь означает, что этот метод можно "ожидать" (await). Т. е. наличие слова async это не соглашение о потокобезопасности метода ("async isn't a part of the signature, so you don't actually need to be concerned with whether the method implementing the interface is async or not"). Зато потом какая свобода - добавил потокобезопасность в свои методы и всё, что осталось сделать вашим клиентам - это "проэвейтить" их, чтобы получить "бесплатную многопоточность". Минимум рефакторинга. Просто смотрю, в новых статьях многие модные челы вообще всё асинками делают - обработчики событий в настольных приложениях, методы контроллеров в ASP.NET MVC приложениях и т. п. Хотя, например, по второму варианту один гуру асинков не рекомендует так уж бездумно пихать их везде ("That’s why one of the principles of ASP.NET is to avoid using thread pool threads (except for the request thread that ASP.NET gives you, of course)."). Или всё же писать методы с таким ключевым словом нужно только для явно потокобезопасных методов? Ну и, раз async не часть сигнатуры, то придётся таки как-то обозначить потокобезопасность в сигнатуре - например, добавив слово async в имя метода (типа MyMethodAsync)? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 05:49 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
ЕвгенийВDude42 Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом? Всегда надо думать и понимать что делаешь, а иначе не видать удачи. Вот Алексей правильно сказал, что не надо путать асинхронность и многопоточность. Добавляя async, я всего лишь даю возможность выполнить метод асинхронно. Async это не соглашение о потокобезопасности. Если вы вызываете асинхронный метод много раз "подряд", создавая конкуренцию между потоками, то это ваши проблемы. А я всего лишь позволил выполнить этот метод в другом потоке "хотя бы один раз", не гарантирую потокобезопасности. Про потокобезопасность я либо пишу в комментариях к методу, либо создаю соглашение - например, добавляя в потокобезопасном методе какое-нибудь ключевое слово к имени метода, либо вообще вынося такие методы в отдельное пространство имён, как в Concurrent Collections в .NET сделали. Правильно я рассуждаю? Т. е. таки можно писать вообще все методы с ключевым словом async? Я бы даже сказал - нужно? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 05:58 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
авторДобавляя async, я всего лишь даю возможность выполнить метод асинхронно. Всё ещё проще. Я всего лишь позволяю выполнить метод асинхронно с помощью удобного синтаксического сахара с помощью слова await. Ведь вам и раньше никто не мешал выполнять любые методы асинхронно - в Task.Run(() => ...) можно запихнуть вообще любой метод. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 06:00 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
авторВсё ещё проще. Я всего лишь позволяю выполнить метод асинхронно с помощью удобного синтаксического сахара с помощью слова await. Ведь вам и раньше никто не мешал выполнять любые методы асинхронно - в Task.Run(() => ...) можно запихнуть вообще любой метод. Т. е. асинхронно можно было выполнить метод всегда (по крайней мере, с момента появления Task, если не считать класс Thread). Просто сейчас добавление слова async вообще к любому методу - это такое правило хорошего тона, или, лучше сказать, "современный код", соответствующий последним версиям фреймворка, где можно "эвейтить" вообще любой код. Где-то на Хабре встречал коммент, что в UWP вообще все методы - async. И это кому-то мешало своей непривычностью, чтоли. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 06:04 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Резюмируя - склоняюсь к этому: автордобавление слова async вообще к любому методу - это такое правило хорошего тона, или, лучше сказать, "современный код", соответствующий последним версиям фреймворка, где можно "эвейтить" вообще любой код. авторПро потокобезопасность я либо пишу в комментариях к методу, либо создаю соглашение - например, добавляя в потокобезопасном методе какое-нибудь ключевое слово к имени метода (например, добавив слово async в имя метода - типа MyMethodAsync), либо вообще вынося такие методы в отдельное пространство имён, как в Concurrent Collections в .NET сделали. Что думаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 06:11 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42Ведь вам и раньше никто не мешал выполнять любые методы асинхронно - в Task.Run(() => ...) можно запихнуть вообще любой метод.Но если этот "любой метод" содержит синхронные операции ввода/вывода, то пользы от такого "оборачивания" мало. Dude42Что думаете?Асинхронный код писать в целом сложнее. Важно понимать, ради чего эти сложности в твоём проекте. Мотивация "на всякий случай" вряд ли будет полезна. Основные применения асинхронностей: 1. В GUI приложении асинхронные операции позволяют не блокировать UI-поток. 2. Асинхронный ввод/вывод позволяет уменьшить количество "спящих" потоков. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 06:45 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42Резюмируя - склоняюсь к этому: автордобавление слова async вообще к любому методу - это такое правило хорошего тона, или, лучше сказать, "современный код", соответствующий последним версиям фреймворка, где можно "эвейтить" вообще любой код. Что думаете? Думаю, что любую возможность следует применять осмысленно, а не лепить где попало. Если ваш метод возвращает 2+2, какой смысл помечать его как async? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 13:29 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Алексей КНо если этот "любой метод" содержит синхронные операции ввода/вывода, то пользы от такого "оборачивания" мало. Похоже это ключевое. Внутри код тоже должен быть асинхронным (вплоть до вызова асинхронных I/O операций) иначе всё будет синхронно + лишние издержки. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.06.2016, 15:42 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса? Вот я и подумал, что челы из команды .NET уже вовсю и везде асинки лепят по-умолчанию. Или для сервисов таки имеет смысл все публичные методы делать с async? - Т. е. клиенту так и так приходится ожидать результата выполнения метода, так почему бы не сделать эти методы асинхроннымы по-умолчанию, да? Клиент уже сам решит, ожидать этот метод параллельно или последовательно, да? Т. е. WCF - это одна из областей, где есть смысл вообще все публичные методы сделать по-умолчанию async, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2016, 04:10 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса? Вот я и подумал, что челы из команды .NET уже вовсю и везде асинки лепят по-умолчанию. Или для сервисов таки имеет смысл все публичные методы делать с async? - Т. е. клиенту так и так приходится ожидать результата выполнения метода, так почему бы не сделать эти методы асинхроннымы по-умолчанию, да? Клиент уже сам решит, ожидать этот метод параллельно или последовательно, да? Т. е. WCF - это одна из областей, где есть смысл вообще все публичные методы сделать по-умолчанию async, да?Ну ты если для себя уже всё решил, что ты ещё хочешь услышать от общественности? По существу всё, что нужно было сказать, уже сказано. Если интересуют технические подробности, то спрашивай что-то конкретное. А почему в формочке VS галочки по умолчанию стоят, это вопрос скорее философский, лучше обратиться с ним в другой раздел форума. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2016, 05:16 |
|
А есть ли смысл теперь писать методы НЕ async?
|
|||
---|---|---|---|
#18+
Dude42А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса? Чтобы ты не блокировал поток UI выполняя I/O операций, без подпрыгивания на месте. Просто позаботились о твоём душевном равновесии. Плохо? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.06.2016, 11:34 |
|
|
start [/forum/topic.php?fid=20&msg=39259404&tid=1400501]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
43ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 160ms |
0 / 0 |