Я пытаюсь понять, как работает новая асинхронная функция C # 5. Предположим, я хочу разработать атомарную функцию приращения для приращения целого числа в вымышленном IntStore. Эта функция выполняется только в одном потоке.
async void IncrementKey(string key) {
int i = await IntStore.Get(key);
IntStore.Set(key, i+1);
}
Мне кажется, что эта функция несовершенна. Два вызова IncrementKey могут вернуть один и тот же номер из IntStore (скажем, 5), а затем установить его на 6, потеряв при этом одно из приращений?
Как это можно переписать, если IntStore.Get для правильной работы асинхронен (возвращает Task)?
Производительность имеет решающее значение, есть ли решение, которое позволяет избежать блокировки?