public Task Write(StoreItems changes) { lock (_syncroot) { foreach (var change in changes) { StoreItem newValue = change.Value as StoreItem; StoreItem oldValue = null; if (_memory.TryGetValue(change.Key, out object x)) { oldValue = x as StoreItem; } if (oldValue == null || newValue.eTag == "*" || oldValue.eTag == newValue.eTag) { // clone and set etag newValue = newValue.Clone() as StoreItem; newValue.eTag = (_eTag++).ToString(); _memory[change.Key] = newValue; } else { throw new Exception("etag conflict"); } } } return(Task.CompletedTask); }