Ignore:
Timestamp:
10/13/17 14:21:09 (2 years ago)
Author:
pfleck
Message:

#2846: Fixed uncaught ObjectDisposedException in HiveJobManagerView.

  • Caught a potential NullReferenceException in the HiveClient when ClearHiveClient is called asynchronous.
  • Use Task.Run for HiveClient.Refresh instead of Begin/EndInvoke.
  • Use await with try-catch to marshal back any uncaught exceptions back to the UI-thread where the exception is displayed instead of HL crashing.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Clients.Hive/3.3/HiveClient.cs

    r14901 r15419  
    9999          jobs.Add(new RefreshableJob(j));
    100100        }
    101       }
    102       catch {
     101      } catch (NullReferenceException) {
     102        // jobs was set to null during ClearHiveClient
     103      } catch {
    103104        jobs = null;
    104105        throw;
    105       }
    106       finally {
     106      } finally {
    107107        OnRefreshed();
    108108      }
    109     }
    110 
    111     public void RefreshAsync(Action<Exception> exceptionCallback) {
    112       var call = new Func<Exception>(delegate() {
    113         try {
    114           Refresh();
    115         }
    116         catch (Exception ex) {
    117           return ex;
    118         }
    119         return null;
    120       });
    121       call.BeginInvoke(delegate(IAsyncResult result) {
    122         Exception ex = call.EndInvoke(result);
    123         if (ex != null) exceptionCallback(ex);
    124       }, null);
    125109    }
    126110    #endregion
     
    146130    }
    147131    public static void StoreAsync(Action<Exception> exceptionCallback, IHiveItem item, CancellationToken cancellationToken) {
    148       var call = new Func<Exception>(delegate() {
     132      var call = new Func<Exception>(delegate () {
    149133        try {
    150134          Store(item, cancellationToken);
    151         }
    152         catch (Exception ex) {
     135        } catch (Exception ex) {
    153136          return ex;
    154137        }
    155138        return null;
    156139      });
    157       call.BeginInvoke(delegate(IAsyncResult result) {
     140      call.BeginInvoke(delegate (IAsyncResult result) {
    158141        Exception ex = call.EndInvoke(result);
    159142        if (ex != null) exceptionCallback(ex);
     
    294277        }
    295278        TS.Task.WaitAll(tasks.ToArray());
    296       }
    297       finally {
     279      } finally {
    298280        refreshableJob.Job.Modified = false;
    299281        refreshableJob.IsProgressing = false;
     
    394376        taskUploadSemaphore.Release(); semaphoreReleased = true; // the semaphore has to be release before waitall!
    395377        TS.Task.WaitAll(tasks.ToArray());
    396       }
    397       finally {
     378      } finally {
    398379        if (!semaphoreReleased) taskUploadSemaphore.Release();
    399380      }
     
    443424        } else if (refreshableJob.IsPaused()) {
    444425          refreshableJob.ExecutionState = Core.ExecutionState.Paused;
    445         } else { 
     426        } else {
    446427          refreshableJob.ExecutionState = Core.ExecutionState.Started;
    447428        }
    448429        refreshableJob.OnLoaded();
    449       }
    450       finally {
     430      } finally {
    451431        refreshableJob.IsProgressing = false;
    452432        refreshableJob.Progress.Finish();
     
    485465      try {
    486466        return PersistenceUtil.Deserialize<ItemTask>(taskData.Data);
    487       }
    488       catch {
     467      } catch {
    489468        return null;
    490469      }
     
    497476    public static void TryAndRepeat(Action action, int repetitions, string errorMessage, ILog log = null) {
    498477      while (true) {
    499         try { action(); return; }
    500         catch (Exception e) {
     478        try { action(); return; } catch (Exception e) {
    501479          if (repetitions == 0) throw new HiveException(errorMessage, e);
    502480          if (log != null) log.LogMessage(string.Format("{0}: {1} - will try again!", errorMessage, e.ToString()));
Note: See TracChangeset for help on using the changeset viewer.