public override async Task BeforeEnter() { // Make sure only one update action is done at a time using (await _syncLockFactory.Create().ConfigureAwait(false)) { await _projectionDataService.UpdateProjection().ConfigureAwait(false); _projectedData = await _projectionDataService.GetProjection().ConfigureAwait(false); } }
public override async Task AfterEnter() { // Update asynchronously so that other threads receive the previous projection and don't wait for the update await Task.Factory.StartNew(async() => { // Make sure only one update action is done at a time using (await _syncLockFactory.Create().ConfigureAwait(false)) { await _projectionDataService.UpdateProjection().ConfigureAwait(false); _projectedData = await _projectionDataService.GetProjection().ConfigureAwait(false); } await _projectionSystem.MarkProjectionAsUpToDate().ConfigureAwait(false); }, CancellationToken.None, TaskCreationOptions.LongRunning, _taskScheduler) .ConfigureAwait(false); }
public async Task <IEnumerable <TItem> > GetProjection() { using (await _getProjectionLockFactory.Create().ConfigureAwait(false)) { if (State.Id == StateId.Uninitialised) { await TransitionToCreatingState().ConfigureAwait(false); } if (State.Id == StateId.Expired) { await TransitionToUpdatingState().ConfigureAwait(false); } return(await State.GetProjection().ConfigureAwait(false)); } }