public void RunAsync(SyncTickers syncTickers, StrategyBase strategy, ISimulationSettings settings) { if (syncTickers == null) throw new ArgumentNullException("syncTickers"); if (strategy == null) throw new ArgumentNullException("strategy"); if (settings == null) throw new ArgumentNullException("settings"); if (IsBusy) throw new InvalidOperationException("Already running."); var asyncSimulationAlgorithm = new SimulationContextAsyncDecorator(SimulationContextFactory.CreateContext()); cancelSimulation = () => asyncSimulationAlgorithm.Cancel(); simulationTask = Task.Factory.StartNew(() => { using (asyncSimulationAlgorithm) { var runResult = base.SimulationAlgorithmFlow(asyncSimulationAlgorithm, syncTickers, strategy, settings); lock (cancelRaceConditionSync) { cancelSimulation = delegate { }; } EndInfo = new SimulationEndEventArgs { Error = runResult.Error, Result = runResult.Value, EndReason = runResult.Error != null ? SimulationEndReason.Error : runResult.Value != null ? SimulationEndReason.Completion : SimulationEndReason.Cancellation }; SimulationEnded(this, EndInfo); } }); //while (simulationTask.Status < TaskStatus.Running) ; }
private void ShowResult(SimulationEndEventArgs args) { if (args.EndReason != SimulationEndReason.Completion) return; mainWindow.CreateChild( vmFactory.Create(args.Result) ).Show(); }
private void EndSimulation(SimulationEndEventArgs args) { lock (isRunningLocker) isRunning = false; dispatcher.InvokeIfRequired(() => { SimulationEnded(args); IsRunningChanged(isRunning); }); }