/// <summary> /// Runs async commands queue /// </summary> /// <returns></returns> public async Task SaveAsync() { if (_actions.IsRunning) { throw new Exception(".SaveAsync cannot be called within post-save action"); } if (_finallyActions.IsRunning) { throw new Exception(".SaveAsync cannot be called within finally action"); } Exception thrown = null; try { await _serviceManager.OnSaveAsync(); CommandsDispatcher dispatcher = new CommandsDispatcher(_mx, _aux.TraceCollector, _tranManager); await dispatcher.DispatchAsync(_pipeline, _actions); await _serviceManager.OnFinallyAsync(); await _finallyActions.RunAsync(); await dispatcher.DispatchAsync(_pipeline, _actions); } catch (Exception ex) { if (_exceptionHandler == null || !_exceptionHandler(ex)) { throw; } } }
/// <summary> /// Runs async commands queue /// </summary> /// <returns></returns> public async Task SaveAsync(OuterTransactionMode transaction = OuterTransactionMode.None, OuterTransactionIsolationLevel level = OuterTransactionIsolationLevel.Chaos) { if (_actions.IsRunning) { throw new Exception(".SaveAsync cannot be called within post-save action"); } if (_finallyActions.IsRunning) { throw new Exception(".SaveAsync cannot be called within finally action"); } IOuterTransaction tran = ObtainTransaction(transaction, level); Exception thrown = null; try { await _serviceManager.OnSaveAsync(); CommandsDispatcher dispatcher = new CommandsDispatcher(_mx, _aux.TraceCollector); await dispatcher.DispatchAsync(_pipeline, _actions); await _serviceManager.OnFinallyAsync(); await _finallyActions.RunAsync(); await dispatcher.DispatchAsync(_pipeline, _actions); tran?.Commit(); //CleanupAfterSave(); } catch (Exception ex) { _exceptionHandler?.Invoke(ex); thrown = ex; } finally { try { tran?.Dispose(); } catch (Exception) { if (thrown == null) { throw; } } if (thrown != null) { throw thrown; } } }
public async Task DispatchAsync(Pipeline queue, ActionsQueue postSave) { do { HashSet <string> usedChannels = new HashSet <string>(); if (queue.HasEffects) { await DispatchInternalAsync(queue.GetEffects(), usedChannels); await SaveAsync(usedChannels); await postSave.RunAsync(); } } while (queue.HasEffects); }
public async Task DispatchAsync(Pipeline queue, ActionsQueue postSave, CancellationToken token = default) { do { HashSet <string> usedChannels = new HashSet <string>(); if (queue.HasEffects) { await RunCommandsAsync(queue.GetEffects(), usedChannels, token); Stopwatch sw = null; Exception thrown = null; if (_traceCollector != null && _traceCollector.Profiling) { sw = new Stopwatch(); sw.Start(); } try { await SaveAsync(usedChannels, token); } catch (Exception ex) { thrown = ex; throw new TectureSaveException(ex); } finally { if (sw != null) { sw.Stop(); } _traceCollector?.Save(sw?.Elapsed ?? TimeSpan.Zero, thrown); } } else { _traceCollector?.Save(TimeSpan.Zero, null); } if (postSave != null) { await postSave.RunAsync(token); } } while (queue.HasEffects); }
/// <summary> /// Runs async commands queue /// </summary> /// <returns></returns> public async Task SaveAsync(CancellationToken token = default) { if (_actions.IsRunning) { throw new Exception(".SaveAsync cannot be called within post-save action"); } if (_finallyActions.IsRunning) { throw new Exception(".SaveAsync cannot be called within finally action"); } Exception thrown = null; CommandsDispatcher dispatcher = new CommandsDispatcher(_mx, _aux.TraceCollector, _tranManager); try { await _serviceManager.OnSaveAsync(token); await dispatcher.DispatchAsync(_pipeline, _actions, token); } catch (Exception ex) { thrown = ex; } finally { Exception thrown2 = null; try { if (_tc != null) { _tc.Command(new Comment() { Annotation = "<<< Finally block >>>", Channel = typeof(NoChannel), IsExecuted = true }); } await _serviceManager.OnFinallyAsync(thrown, token); await _finallyActions.RunAsync(token); if (_pipeline.HasEffects) { await dispatcher.DispatchAsync(_pipeline, null, token); } } catch (Exception finException) { thrown2 = finException; } finally { _tc?.Command(new Comment() { Annotation = "<<< End of Finally block >>>", Channel = typeof(NoChannel), IsExecuted = true }); } if (thrown2 != null) { if (thrown == null) { thrown = thrown2; } else { thrown = new AggregateException(thrown, thrown2); } } if (thrown != null) { if (_exceptionHandler == null || !_exceptionHandler(thrown)) { throw thrown; } } } }