Free cookie consent management tool by TermsFeed Policy Generator

Ticket #2061: asynchronouscontentview.patch

File asynchronouscontentview.patch, 5.3 KB (added by gkronber, 10 years ago)
  • HeuristicLab.MainForm.WindowsForms/3.3/Views/AsynchronousContentView.cs

     
    5252    protected new void Invoke(Delegate method, params object[] args) {
    5353      // prevents blocking of worker thread in Invoke, if the control is disposed
    5454      IAsyncResult result = BeginInvoke(method, args);
    55       result.AsyncWaitHandle.WaitOne(1000, false);
     55      result.AsyncWaitHandle.WaitOne(10, false);
    5656      if (result.IsCompleted) try { EndInvoke(result); }
    5757        catch (ObjectDisposedException) { } else {
    5858        ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle,
  • HeuristicLab.Optimization/3.3/MetaOptimizers/Experiment.cs

     
    2323using System.Collections.Generic;
    2424using System.Drawing;
    2525using System.Linq;
     26using System.Threading;
    2627using HeuristicLab.Collections;
    2728using HeuristicLab.Common;
    2829using HeuristicLab.Core;
     
    179180      experimentStopped = false;
    180181      foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState != ExecutionState.Started)) {
    181182        // 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        try { optimizer.Prepare(clearRuns); }
     184        catch (InvalidOperationException) { }
    183185      }
    184186    }
    185187    public void Start() {
     
    192194      IOptimizer optimizer = Optimizers.FirstOrDefault(x => (x.ExecutionState == ExecutionState.Prepared) || (x.ExecutionState == ExecutionState.Paused));
    193195      if (optimizer != null) {
    194196        // a race-condition may occur when the optimizer has changed the state by itself in the meantime
    195         try { optimizer.Start(); } catch (InvalidOperationException) { }
     197        try { optimizer.Start(); }
     198        catch (InvalidOperationException) { }
    196199      }
    197200    }
    198201    public void Pause() {
     
    204207      experimentStopped = false;
    205208      foreach (IOptimizer optimizer in Optimizers.Where(x => x.ExecutionState == ExecutionState.Started)) {
    206209        // a race-condition may occur when the optimizer has changed the state by itself in the meantime
    207         try { optimizer.Pause(); } catch (InvalidOperationException) { }
     210        try { optimizer.Pause(); }
     211        catch (InvalidOperationException) { }
    208212      }
    209213    }
    210214    public void Stop() {
     
    217221      if (Optimizers.Any(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) {
    218222        foreach (var optimizer in Optimizers.Where(x => (x.ExecutionState == ExecutionState.Started) || (x.ExecutionState == ExecutionState.Paused))) {
    219223          // a race-condition may occur when the optimizer has changed the state by itself in the meantime
    220           try { optimizer.Stop(); } catch (InvalidOperationException) { }
     224          try { optimizer.Stop(); }
     225          catch (InvalidOperationException) { }
    221226        }
    222227      } else {
    223228        OnStopped();
     
    340345    }
    341346
    342347    private readonly object locker = new object();
     348    private readonly object runsLocker = new object();
    343349    private void optimizer_ExceptionOccurred(object sender, EventArgs<Exception> e) {
    344350      lock (locker)
    345351        OnExceptionOccurred(e.Value);
    346352    }
    347353    private void optimizer_ExecutionTimeChanged(object sender, EventArgs e) {
    348       lock (locker)
    349         ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime);
     354      // only wait for maximally 100ms to acquire lock, otherwise return and don't update the execution time
     355      var success = Monitor.TryEnter(locker, 100);
     356      if (!success) return;
     357      ExecutionTime = Optimizers.Aggregate(TimeSpan.Zero, (t, o) => t + o.ExecutionTime);
     358      Monitor.Exit(locker);
    350359    }
    351360    private void optimizer_Paused(object sender, EventArgs e) {
    352361      lock (locker)
     
    357366        if (Optimizers.All(x => x.ExecutionState == ExecutionState.Prepared)) OnPrepared();
    358367    }
    359368    private void optimizer_Started(object sender, EventArgs e) {
     369      if (ExecutionState == ExecutionState.Started) return;
    360370      lock (locker)
    361371        if (ExecutionState != ExecutionState.Started) OnStarted();
    362372    }
     
    373383      }
    374384    }
    375385    private void optimizer_Runs_CollectionReset(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    376       lock (locker) {
     386      lock (runsLocker) {
    377387        Runs.RemoveRange(e.OldItems);
    378388        Runs.AddRange(e.Items);
    379389      }
    380390    }
    381391    private void optimizer_Runs_ItemsAdded(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    382       lock (locker)
     392      lock (runsLocker)
    383393        Runs.AddRange(e.Items);
    384394    }
     395
    385396    private void optimizer_Runs_ItemsRemoved(object sender, CollectionItemsChangedEventArgs<IRun> e) {
    386       lock (locker)
     397      lock (runsLocker)
    387398        Runs.RemoveRange(e.Items);
    388399    }
    389400