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

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

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

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

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

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

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

Что ещё?
...
Рейтинг: 0 / 0
21.06.2016, 09:18
    #39259342
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть ли смысл теперь писать методы НЕ async?
Dude42Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо.Например, если внутри асинхронного метода есть продолжения, синхронизированные с UI-потоком (WPF, WinForms), и ты синхронно ожидаешь окончания этого метода в UI-потоке, то будет мёртвая блокировка.
...
Рейтинг: 0 / 0
21.06.2016, 09:42
    #39259355
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть ли смысл теперь писать методы НЕ async?
Алексей КЧто ещё?
Простой пример многопоточного использования непотокобезопасного кода
Код: 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
21.06.2016, 09:45
    #39259357
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть ли смысл теперь писать методы НЕ async?
Dima TАлексей КЧто ещё?
Простой пример многопоточного использования непотокобезопасного кодаНе надо путать многопоточность и асинхронность.
...
Рейтинг: 0 / 0
21.06.2016, 10:07
    #39259365
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть ли смысл теперь писать методы НЕ async?
Алексей КНе надо путать многопоточность и асинхронность.
я не путаю, асинхронности без использования многопоточности не бывает. А если начать ее использовать так
Dude42Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом?
то описанные мною грабли рано или поздно сработают.
...
Рейтинг: 0 / 0
21.06.2016, 10:15
    #39259370
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А есть ли смысл теперь писать методы НЕ async?
Dude42 Т. е. можно подсовывать асинки вместо обычных методов старым программам и всё будет хорошо, а новые могут и поавейтить, чтобы воспользоваться преимуществом?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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