Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
07/03/12 16:46:35 (12 years ago)
Author:
gkronber
Message:

#1847: merged r8084:8205 from trunk into GP move operators branch

Location:
branches/GP-MoveOperators
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/GP-MoveOperators

  • branches/GP-MoveOperators/HeuristicLab.Optimization/3.3/Experiment.cs

    r7797 r8206  
    178178      experimentStarted = false;
    179179      experimentStopped = false;
    180       foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started))
    181         //if (clearRuns || optimizer.ExecutionState != ExecutionState.Prepared)
    182           optimizer.Prepare(clearRuns);
     180      foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started)) {
     181        // a race-condition may occur when the optimizer has changed the state by itself in the meantime
     182        try { optimizer.Prepare(clearRuns); } catch (InvalidOperationException) { }
     183      }
    183184    }
    184185    public void Start() {
     
    190191      experimentStopped = false;
    191192      IOptimizer optimizer = Optimizers.FirstOrDefault(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused));
    192       if (optimizer != null) optimizer.Start();
     193      if (optimizer != null) {
     194        // a race-condition may occur when the optimizer has changed the state by itself in the meantime
     195        try { optimizer.Start(); } catch (InvalidOperationException) { }
     196      }
    193197    }
    194198    public void Pause() {
     
    199203      experimentStarted = false;
    200204      experimentStopped = false;
    201       foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started))
    202         optimizer.Pause();
     205      foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started)) {
     206        // a race-condition may occur when the optimizer has changed the state by itself in the meantime
     207        try { optimizer.Pause(); } catch (InvalidOperationException) { }
     208      }
    203209    }
    204210    public void Stop() {
     
    210216      experimentStopped = true;
    211217      if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) {
    212         foreach (IOptimizer optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused)))
    213           optimizer.Stop();
     218        foreach (var optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) {
     219          // a race-condition may occur when the optimizer has changed the state by itself in the meantime
     220          try { optimizer.Stop(); } catch (InvalidOperationException) { }
     221        }
    214222      } else {
    215223        OnStopped();
     
    326334      optimizer.Runs.ItemsRemoved -= new CollectionItemsChangedEventHandler<IRun>(optimizer_Runs_ItemsRemoved);
    327335    }
     336
     337    private readonly object locker = new object();
    328338    private void optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) {
    329       OnExceptionOccurred(e.Value);
     339      lock (locker)
     340        OnExceptionOccurred(e.Value);
    330341    }
    331342    private void optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
    332       ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime);
     343      lock (locker)
     344        ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime);
    333345    }
    334346    private void optimizer_Paused(object sender, EventArgs e) {
    335       if (Optimizers.All(x => x.ExecutionState != ExecutionState.Started)) OnPaused();
     347      lock (locker)
     348        if (Optimizers.All(x => x.ExecutionState != ExecutionState.Started)) OnPaused();
    336349    }
    337350    private void optimizer_Prepared(object sender, EventArgs e) {
    338       if (Optimizers.All(x => x.ExecutionState == ExecutionState.Prepared)) OnPrepared();
     351      lock (locker)
     352        if (Optimizers.All(x => x.ExecutionState == ExecutionState.Prepared)) OnPrepared();
    339353    }
    340354    private void optimizer_Started(object sender, EventArgs e) {
    341       if (ExecutionState != ExecutionState.Started) OnStarted();
     355      lock (locker)
     356        if (ExecutionState != ExecutionState.Started) OnStarted();
    342357    }
    343358    private void optimizer_Stopped(object sender, EventArgs e) {
    344       if (experimentStopped) {
    345         if (Optimizers.All(x => (x.ExecutionState == ExecutionState.Stopped) || (x.ExecutionState == ExecutionState.Prepared))) OnStopped();
    346       } else {
    347         if (experimentStarted && Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused))) {
    348           Optimizers.First(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)).Start();
    349         } else if (Optimizers.All(x => x.ExecutionState == ExecutionState.Stopped)) OnStopped();
    350         else if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)) && Optimizers.All(o => o.ExecutionState != ExecutionState.Started)) OnPaused();
     359      lock (locker) {
     360        if (experimentStopped) {
     361          if (Optimizers.All(x => (x.ExecutionState == ExecutionState.Stopped) || (x.ExecutionState == ExecutionState.Prepared))) OnStopped();
     362        } else {
     363          if (experimentStarted && Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused))) {
     364            Optimizers.First(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)).Start();
     365          } else if (Optimizers.All(x => x.ExecutionState == ExecutionState.Stopped)) OnStopped();
     366          else if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused)) && Optimizers.All(o => o.ExecutionState != ExecutionState.Started)) OnPaused();
     367        }
    351368      }
    352369    }
    353370    private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    354       Runs.RemoveRange(e.OldItems);
    355       Runs.AddRange(e.Items);
     371      lock (locker) {
     372        Runs.RemoveRange(e.OldItems);
     373        Runs.AddRange(e.Items);
     374      }
    356375    }
    357376    private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    358       Runs.AddRange(e.Items);
     377      lock (locker)
     378        Runs.AddRange(e.Items);
    359379    }
    360380    private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    361       Runs.RemoveRange(e.Items);
     381      lock (locker)
     382        Runs.RemoveRange(e.Items);
    362383    }
    363384
Note: See TracChangeset for help on using the changeset viewer.