История изменений
Исправление KivApple, (текущая версия) :
Пока вижу только, что при использовании асинхронности нужно думать примерно о том же, что и при многопоточном программировании. Если убрать await, но зато запустить два потока, которые будут вызывать doIt, то результат будет таким же (первая doIt может быть прервана в середине другой doIt, которая сбросит флаг busy). И да, в большом приложении тоже может быть не очевидно с ходу, что к методам класса может быть одновременное обращение из разных потоков. И там, и там решение - использовать что-то типа семафора. То есть если busy == true на входе в doIt, то нужно уснуть, пока он не станет равен false (разумеется, эту логику - захват с ожиданием, освобождение лучше вынести в отдельный класс).
Отсюда делаю вывод, что асинхронное программирование не более неочевидное, чем просто многопоточное.
При этом в отличии от многопоточного:
1) Во многих ситуациях я таки могут быть уверен, что между двумя await меня никто не прервёт. Поэтому не нужны всякие атомарные операции и т. д. Да и блокировок меньше становится. Например, добавление в связанный список, которое является по сути несколькими присваиваниями простых переменных не требуется защищать блокировкой.
2) Жрёт меньше памяти, потому что не надо держать отдельные стеки для каждого потока.
Исходная версия KivApple, :
Пока вижу только, что при использовании асинхронности нужно думать примерно о том же, что и при многопоточном программировании. Если убрать await, но зато запустить два потока, которые будут вызывать doIt, то результат будет таким же (первая doIt может быть прервана в середине другой doIt, которая сбросит флаг busy). И да, в большом приложении тоже может быть не очевидно с ходу, что к методам класса может быть одновременное обращение из разных потоков. И там, и там решение - использовать что-то типа семафора. То есть если busy == true на входе в doIt, то нужно уснуть, пока он не станет равен false (разумеется, эту логику - захват с ожиданием, освобождение лучше вынести в отдельный класс).
Отсюда делаю вывод, что асинхронное программирование не более неочевидное, чем просто многопоточное.
При этом в отличии от многопоточного:
1) Во многих ситуациях я таки могут быть уверен, что между двумя await меня никто не прервёт. Поэтому не нужны всякие атомарные операции и т. д. Да и блокировок меньше становится.
2) Жрёт меньше памяти, потому что не надо держать отдельные стеки для каждого потока.