public async Task Modify(Action <T> modifer) { AccessInterceptor inter = null; T proxy = default(T); using (await _lock.ReaderLock()) { inter = new AccessInterceptor(_state, true); proxy = _createProxy(inter); } using (inter) { using (await _lock.WriterLock()) { modifer(proxy); } // now that the lock is released, it's time to raise the proper events var literalEventTasks = inter.ChangedLiterals() .Where(pair => _events.ContainsKey(pair.prop)) .Select(pair => _events[pair.prop].Invoke(pair.value)); var collectionEventTasks = inter.ChangedCollections() .Where(item => _events.ContainsKey(item.Key)) .Select(item => _events[item.Key].Invoke( _createCollectionChangesArg(item, inter.OldCollectionValue(item.Key)))); await Task.WhenAll(literalEventTasks.Concat(collectionEventTasks)); } }
public ServiceStore(Action <T> init) : this() { using (var inter = new AccessInterceptor(_state, true)) { var proxy = _createProxy(inter); init(proxy); } }
public CollectionProxy( List <T> list, AccessInterceptor interceptor, Action <IChange> onChange, bool modifiable) { _interceptor = interceptor; _list = list; _onChange = onChange; _modifiable = modifiable; }
public async Task <K> Select <K>(Func <T, K> query) { AccessInterceptor inter = null; T proxy = default(T); K res = default(K); using (await _lock.ReaderLock()) { using (inter = new AccessInterceptor(_state, false)) { proxy = _createProxy(inter); res = query(proxy); } } return(res); }
private T _createProxy(AccessInterceptor interceptor) { var proxy = _proxyGenerator.CreateInterfaceProxyWithoutTarget <T>(interceptor); return(proxy); }