private void Execute(Action action) { Stopwatch timer = Stopwatch.StartNew(); System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.WaitCursor; try { SetStatus("{0}...", action.DescriptivePhrase); using (new ScopedUndoContext(this, action.KeyName)) { action.Execute(); } SetStatus("{0} completed in {1} seconds", action.DescriptivePhrase, timer.Elapsed.TotalSeconds); } catch (Exception ex) { Error(ex); SetStatus("Error {0}: {1}", action.DescriptivePhrase, ex.Message); } finally { timer.Stop(); System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default; } }
public Action UsePower(Power power, VillageMember initiator, Actor target) { if (target != null) { Log.Debug(this.Name + " uses power " + power.GetType().Name + " on " + target.Name); } else { Log.Debug(this.Name + " uses power " + power.GetType().Name); } if (target is VillageMember) { if (((VillageMember)target).State == MemberState.Dead) { throw new TargetIsDeadException(target.Name + " is dead."); } } Action action = new Action(power, this, initiator, target); try { action.Prepare(); village.RaiseActionPrepared(action); if (action.Power.Instant) { action.Who.RaisePreActionSource(action); if (action.Target != null) { action.Target.RaisePreActionTarget(action); } if (action.Cancel) { Log.Debug("Action cancelled."); } else { Log.Debug("Executing action..."); action.Execute(); action.Who.RaisePostActionSource(action); if (action.Target != null) { action.Target.RaisePostActionTarget(action); } if (action.Result != null) { action.Result.Apply(); } } } else { Log.Debug("Queueing " + power.GetType().FullName + " on " + target.Name); village.Phase.QueueAction(action); action.ResultMessage = String.Format(power.QueuedMessage, target.Name); } village.RaiseActionExecuted(action); return action; } catch (Action.ActionException ex) { action.ResultMessage = ex.Message; action.Cancel = true; return action; } }
public void TestLockFreeColl2() { Action<ICollection<int>, int, int> collAdd = (coll, a, b) => Enumerable.Range(a,b).Reverse().ForEach(i => coll.Add(i)); ConcurrentHashSet<int> testColl = new ConcurrentHashSet<int>(); var jobs = new Action[] { () => { collAdd(testColl, 0, 500000);}, () => { collAdd(testColl, 500000, 500000);}, () => { collAdd(testColl, 1000000, 500000);}, () => { collAdd(testColl, 1500000, 500000);}, () => { collAdd(testColl, 2000000, 500000);}, () => { collAdd(testColl, 2500000, 500000);}, () => { collAdd(testColl, 3000000, 500000);}, () => { collAdd(testColl, 3500000, 500000);} }; //var jobs = new Action[] { // () => { collAdd(testColl, 0, 1000000);}, // () => { collAdd(testColl, 1000000, 1000000);}, // () => { collAdd(testColl, 2000000, 1000000);}, // () => { collAdd(testColl, 3000000, 1000000);} //}; //var jobs = new Action[] { // () => { collAdd(testColl, 0, 2000000);}, // () => { collAdd(testColl, 2000000, 2000000);} //}; //var jobs = new Action[] { // () => { collAdd(testColl, 0, 4000000);} //}; TimeSpan serial = jobs.Execute(); }