C# 5 の新しい非同期機能がどのように機能するかを理解しようとしています。架空の IntStore で整数をインクリメントするアトミック インクリメント関数を開発したいとします。この関数への複数の呼び出しは、1 つのスレッドでのみ行われます。
async void IncrementKey(string key) {
int i = await IntStore.Get(key);
IntStore.Set(key, i+1);
}
この機能に欠陥があるように私には思えます。IncrementKey を 2 回呼び出すと、IntStore から同じ数値 (たとえば 5) が返され、それが 6 に設定されて、増分の 1 つが失われる可能性があります。
IntStore.Get が非同期 (Task を返す) の場合、正しく動作するためにこれをどのように書き直すことができますか?
パフォーマンスは重要です。ロックを回避するソリューションはありますか?