powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А есть ли смысл теперь писать методы НЕ async?
34 сообщений из 34, показаны все 2 страниц
А есть ли смысл теперь писать методы НЕ async?
    #39259274
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ведь все асинхронные методы можно вызывать синхронно и от старых API не убудет. Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом?

Единственное, я не понял, если запустить код с ключевым словом async на старом фреймворке - 3, 3.5 там, он не выдаст ли ошибку, что такого ключевого слова нет, и не не захочет ли компилироваться?

Просто смотрю, щас некоторые API (например, генератор прокси-классов для WCF) по-умолчанию создают пару async-не async методов. Скоро, видать, вообще только асинки генерить будут.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259284
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42Скоро, видать, вообще только асинки генерить будут.
Не будут. Асинхронность не бесплатна. Использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность. У большинства классов она гарантирована только статическим методам, исключение классы Concurrent*
Тормоза из-за синхронизации получаются значительные. Затести например скорость работы Dictionary<> и ConcurrentDictionary<>
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259326
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T Одновременное использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность.Добавил.

Описанная ситуация с асинхронным кодом случается не чаще чем с синхронным.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259337
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КDima T Одновременное использование одного и того же объекта из разных потоков требует синхронизации доступа к данным внутри объекта, т.е. потокобезопасность.Добавил.

Описанная ситуация с асинхронным кодом случается не чаще чем с синхронным.
Описанная ситуация в синхронном коде отработает корректно, а в асинхронном могут случиться "мистические явления", источник которых устанешь потом искать, т.к. повторно воспроизвести их очень проблематично.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259339
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TАлексей Кпропущено...
Добавил.

Описанная ситуация с асинхронным кодом случается не чаще чем с синхронным.
Описанная ситуация в синхронном коде отработает корректно, а в асинхронном могут случиться "мистические явления", источник которых устанешь потом искать, т.к. повторно воспроизвести их очень проблематично.Ну давай вместе составим список особенностей, связанных с тем, что продолжение асинхронной операции может производиться в другом потоке:

1. Невозможность использования ThreadStatic полей.

Что ещё?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259342
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо.Например, если внутри асинхронного метода есть продолжения, синхронизированные с UI-потоком (WPF, WinForms), и ты синхронно ожидаешь окончания этого метода в UI-потоке, то будет мёртвая блокировка.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259355
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КЧто ещё?
Простой пример многопоточного использования непотокобезопасного кода
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
	class Worker {
		public int cnt;

		public void DoWork() {
			for(int i = 0; i < 1000000000; i++) {
				cnt++;
			}
		}
	}

	class Program {
		static void Main(string[] args) {
	        var workerObject = new Worker();
	        Thread t1 = new Thread(workerObject.DoWork);
	        Thread t2 = new Thread(workerObject.DoWork);
			t1.Start();
			t2.Start();
			t1.Join();
			t2.Join();
			Console.WriteLine(workerObject.cnt);
		}
	}


подумай сколько будет в итоге, потом сравни с ответом под спойлером
запускал несколько раз в консоли
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
C:\Test>Test.exe
1015349493

C:\Test>Test.exe
1023618106

C:\Test>Test.exe
1016220696

C:\Test>Test.exe
1021149198

Я про такую мистику многопоточности говорил
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259357
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TАлексей КЧто ещё?
Простой пример многопоточного использования непотокобезопасного кодаНе надо путать многопоточность и асинхронность.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259365
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНе надо путать многопоточность и асинхронность.
я не путаю, асинхронности без использования многопоточности не бывает. А если начать ее использовать так
Dude42Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом?
то описанные мною грабли рано или поздно сработают.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259370
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42 Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом?

Всегда надо думать и понимать что делаешь, а иначе не видать удачи.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259404
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TАлексей КНе надо путать многопоточность и асинхронность.
я не путаю,Путаешь. Асинхронность не подразумевает одновременное обращение из разных потоков к параметрам и результатам асинхронного метода.
Dima Tасинхронности без использования многопоточности не бывает.Бывает. Можно в Task обернуть отправку операции в UI-очередь через Dispatcher.BeginInvoke. При этом, не смотря на асинхронность, всё будет выполняться в одном UI-потоке.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259424
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей К,
в node.js есть асинхронность но нет многопоточности
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259536
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВАлексей К,
в node.js есть асинхронность но нет многопоточностиКак и в обычном "браузерном" JavaScript.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39259712
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей ККак и в обычном "браузерном" JavaScript.
Ну....
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260060
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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)?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260061
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ЕвгенийВDude42 Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом?

Всегда надо думать и понимать что делаешь, а иначе не видать удачи.
Вот Алексей правильно сказал, что не надо путать асинхронность и многопоточность. Добавляя async, я всего лишь даю возможность выполнить метод асинхронно. Async это не соглашение о потокобезопасности. Если вы вызываете асинхронный метод много раз "подряд", создавая конкуренцию между потоками, то это ваши проблемы. А я всего лишь позволил выполнить этот метод в другом потоке "хотя бы один раз", не гарантирую потокобезопасности. Про потокобезопасность я либо пишу в комментариях к методу, либо создаю соглашение - например, добавляя в потокобезопасном методе какое-нибудь ключевое слово к имени метода, либо вообще вынося такие методы в отдельное пространство имён, как в Concurrent Collections в .NET сделали.

Правильно я рассуждаю? Т. е. таки можно писать вообще все методы с ключевым словом async? Я бы даже сказал - нужно?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260062
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторДобавляя async, я всего лишь даю возможность выполнить метод асинхронно.
Всё ещё проще. Я всего лишь позволяю выполнить метод асинхронно с помощью удобного синтаксического сахара с помощью слова await. Ведь вам и раньше никто не мешал выполнять любые методы асинхронно - в Task.Run(() => ...) можно запихнуть вообще любой метод.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260064
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторВсё ещё проще. Я всего лишь позволяю выполнить метод асинхронно с помощью удобного синтаксического сахара с помощью слова await. Ведь вам и раньше никто не мешал выполнять любые методы асинхронно - в Task.Run(() => ...) можно запихнуть вообще любой метод.
Т. е. асинхронно можно было выполнить метод всегда (по крайней мере, с момента появления Task, если не считать класс Thread). Просто сейчас добавление слова async вообще к любому методу - это такое правило хорошего тона, или, лучше сказать, "современный код", соответствующий последним версиям фреймворка, где можно "эвейтить" вообще любой код.

Где-то на Хабре встречал коммент, что в UWP вообще все методы - async. И это кому-то мешало своей непривычностью, чтоли.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260065
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Резюмируя - склоняюсь к этому:

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

авторПро потокобезопасность я либо пишу в комментариях к методу, либо создаю соглашение - например, добавляя в потокобезопасном методе какое-нибудь ключевое слово к имени метода (например, добавив слово async в имя метода - типа MyMethodAsync), либо вообще вынося такие методы в отдельное пространство имён, как в Concurrent Collections в .NET сделали.

Что думаете?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260068
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42Ведь вам и раньше никто не мешал выполнять любые методы асинхронно - в Task.Run(() => ...) можно запихнуть вообще любой метод.Но если этот "любой метод" содержит синхронные операции ввода/вывода, то пользы от такого "оборачивания" мало.

Dude42Что думаете?Асинхронный код писать в целом сложнее. Важно понимать, ради чего эти сложности в твоём проекте. Мотивация "на всякий случай" вряд ли будет полезна.

Основные применения асинхронностей:

1. В GUI приложении асинхронные операции позволяют не блокировать UI-поток.

2. Асинхронный ввод/вывод позволяет уменьшить количество "спящих" потоков.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260339
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42Резюмируя - склоняюсь к этому:

автордобавление слова async вообще к любому методу - это такое правило хорошего тона, или, лучше сказать, "современный код", соответствующий последним версиям фреймворка, где можно "эвейтить" вообще любой код.
Что думаете?

Думаю, что любую возможность следует применять осмысленно, а не лепить где попало. Если ваш метод возвращает 2+2, какой смысл помечать его как async?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39260478
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КНо если этот "любой метод" содержит синхронные операции ввода/вывода, то пользы от такого "оборачивания" мало.

Похоже это ключевое. Внутри код тоже должен быть асинхронным (вплоть до вызова асинхронных I/O операций) иначе всё будет синхронно + лишние издержки.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39261461
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса? Вот я и подумал, что челы из команды .NET уже вовсю и везде асинки лепят по-умолчанию.

Или для сервисов таки имеет смысл все публичные методы делать с async? - Т. е. клиенту так и так приходится ожидать результата выполнения метода, так почему бы не сделать эти методы асинхроннымы по-умолчанию, да? Клиент уже сам решит, ожидать этот метод параллельно или последовательно, да?

Т. е. WCF - это одна из областей, где есть смысл вообще все публичные методы сделать по-умолчанию async, да?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39261469
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса? Вот я и подумал, что челы из команды .NET уже вовсю и везде асинки лепят по-умолчанию.

Или для сервисов таки имеет смысл все публичные методы делать с async? - Т. е. клиенту так и так приходится ожидать результата выполнения метода, так почему бы не сделать эти методы асинхроннымы по-умолчанию, да? Клиент уже сам решит, ожидать этот метод параллельно или последовательно, да?

Т. е. WCF - это одна из областей, где есть смысл вообще все публичные методы сделать по-умолчанию async, да?Ну ты если для себя уже всё решил, что ты ещё хочешь услышать от общественности? По существу всё, что нужно было сказать, уже сказано. Если интересуют технические подробности, то спрашивай что-то конкретное. А почему в формочке VS галочки по умолчанию стоят, это вопрос скорее философский, лучше обратиться с ним в другой раздел форума.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39261650
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса?

Чтобы ты не блокировал поток UI выполняя I/O операций, без подпрыгивания на месте. Просто позаботились о твоём душевном равновесии. Плохо?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39261653
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42все публичные методы сделать по-умолчанию async, да?

Нет. Только те методы, которые сейчас или потом, или потенциально могут выполнять асинхронные операции. Например, если метод хоть как-то отдалённо связан с работой с БД (и читать, и писать), файлами, сетью — совершенно точно надо делать его async. Для остальных делать не нужно по методу «просто так».
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39261669
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dude42А чего тогда в генераторе прокси для WCF по умолчанию галки расставлены на генерацию async-версий методов для сервиса?
Потому что обращения по SOAP к внешним сервисам непредсказуемы по скорости работы и гораздо медленнее, чем вызовы метода в кода.

async используется при обращении к внешним ресурсам, либо в UI.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262093
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь понятнее стало. Спасибо.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262203
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
hVosttНапример, если метод хоть как-то отдалённо связан с работой с БД (и читать, и писать), файлами, сетью — совершенно точно надо делать его async.
А если дальнейшие действия зависят от результата выполнения метода?
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262209
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2hVosttНапример, если метод хоть как-то отдалённо связан с работой с БД (и читать, и писать), файлами, сетью — совершенно точно надо делать его async.
А если дальнейшие действия зависят от результата выполнения метода?Традиционно, использовать await или ContinueWith.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262269
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2hVosttНапример, если метод хоть как-то отдалённо связан с работой с БД (и читать, и писать), файлами, сетью — совершенно точно надо делать его async.
А если дальнейшие действия зависят от результата выполнения метода?

await
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262282
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Заставь дурака Богу молиться, он и лоб расшибёт
Give a man enough rope and he’ll hang himself
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262466
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
"Если старик любит поучать молодёжь "как надо жить", то это первый признак того, что он сам совершил все эти ошибки."

Пока что я только спрашиваю о разных возможностях у более опытных товарищей. У безногого - о минных полях, у безпалого - о циркулярных пилах, у безглазого - о жонглировании ножами. Это нормально.
...
Рейтинг: 0 / 0
А есть ли смысл теперь писать методы НЕ async?
    #39262467
Dude42
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:)
...
Рейтинг: 0 / 0
34 сообщений из 34, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / А есть ли смысл теперь писать методы НЕ async?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]