Как работает локальная переменная в асинхронном методе? C#

====================== Имеется код:

async Task HandleUpdateAsync(...)
{
 Base.count++;
 var temp = Base.count;
 //
 //Работа с данными
 //
 Console.WriteLine(temp);
}

Суть:

В асинхронном методе необходимо произвести работу с определённой переменной count(int) из некоторого класса Base. Сам метод вызывается несколько раз подряд. Во время работы программы count меняется со временем и мне нужно вывести определённое состояние этой переменной в консоль. Я отлично понимаю, что будет, если вместо локальной переменной использовать в данной случае глобальную: В консоль выведется последнее состояние этого значения, но что будет в случае с var? Если будет два вызова этого обработчика, то будет два независимых локальных переменных temp?

P.S. В общем и целом, вопрос можно укоротить: Как взаимодействует var и async методы? Создаются ли несколько локальных переменных?


Ответы (2 шт):

Автор решения: pasx

Может быть, Вы путаете async/await и multi-threaded код. Вот простое объяснение.

В синхронном коде поток выполнения, в котором происходит вызов метода, блокируется на время выполнения метода.

При использовании async/await кода вызывающий поток может быть приостановлен на время выполнения метода. Затем система может запустить другой поток, пока метод не завершится. Это делается для оптимизации ресурсов. Или же код может просто исполняться синхронно, если метод возвращается достаточно быстро.

Только в multi-threaded коде несколько потоков могут вызвать ваш метод одновременно - и это произойдет, даже если метод не будет async. В этом случае ваш метод должен быть thread safe. Для этого вы можете просто обернуть код в lock.

→ Ссылка
Автор решения: CrazyElf

Для локальных переменных нет никакой разницы:

  • синхронно ли вызвана функция
  • асинхронно ли вызвана функция
  • многопоточно ли вызвана функция

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

О чём вам действительно стоит беспокоиться в этом коде - это о потокобезопасности работы с переменной класса Base.count. Асинхронность не обязана обязательно быть многопоточной, но если у вас возможны параллельные вызовы этой функции из разных потоков (это может происходить как синхронно, так и асинхронно), вам нужно позаботиться о том, чтобы операция Base.count++ делалась потокобезопасно.

→ Ссылка