internal void TimerTicked() { if (currentTask != null) return; lock (this) { if (currentTask != null) return; if (DateTime.Now - lastRefresh < RefreshRate) return; currentTask = TimerTickedAsync(); if (currentTask == null) return; currentTask .Catch() .Finally(() => { lastRefresh = DateTime.Now; currentTask = null; }); } }
internal void TimerTicked() { if (currentTask != null) return; lock (this) { if (currentTask != null) return; if (DateTime.Now - lastRefresh < GetRefreshRate()) return; using(ServerModel.OnWebRequest(request => request.Headers["Raven-Timer-Request"] = "true")) currentTask = TimerTickedAsync(); if (currentTask == null) return; currentTask .Catch() .Finally(() => { lastRefresh = DateTime.Now; IsForced = false; currentTask = null; }); } }
internal void TimerTicked() { if (ApplicationModel.Current.Server.Value.CreateNewDatabase) { ApplicationModel.Current.Server.Value.CreateNewDatabase = false; ApplicationModel.Current.Server.Value.DocumentStore .AsyncDatabaseCommands .ForSystemDatabase() .GetAsync("Raven/StudioConfig") .ContinueOnSuccessInTheUIThread(doc => { if (doc != null && doc.DataAsJson.ContainsKey("WarnWhenUsingSystemDatabase")) { if(doc.DataAsJson.Value<bool>("WarnWhenUsingSystemDatabase") == false) return; } Command.ExecuteCommand(new CreateDatabaseCommand()); }); } ApplicationModel.Current.UpdateAlerts(); if (currentTask != null) return; lock (this) { if (currentTask != null) return; var timeFromLastRefresh = SystemTime.UtcNow - lastRefresh; var refreshRate = GetRefreshRate(); if (timeFromLastRefresh < refreshRate) return; using(OnWebRequest(request => request.Headers["Raven-Timer-Request"] = "true")) currentTask = TimerTickedAsync(); if (currentTask == null) return; currentTask .Catch() .Finally(() => { lastRefresh = SystemTime.UtcNow; IsForced = false; currentTask = null; }); } }
public Task Catch_WithInputValue_IncompleteTaskOfFault_RunsOnNewThreadAndPostsToSynchronizationContext() { // Arrange int outerThreadId = Thread.CurrentThread.ManagedThreadId; int innerThreadId = Int32.MinValue; Exception thrownException = new Exception(); Exception caughtException = null; var syncContext = new Mock<SynchronizationContext> { CallBase = true }; SynchronizationContext.SetSynchronizationContext(syncContext.Object); Task<int> incompleteTask = new Task<int>(() => { throw thrownException; }); // Act Task<int> resultTask = incompleteTask.Catch(info => { caughtException = info.Exception; innerThreadId = Thread.CurrentThread.ManagedThreadId; return info.Handled(42); }); // Assert incompleteTask.Start(); return resultTask.ContinueWith(task => { Assert.Same(thrownException, caughtException); Assert.NotEqual(innerThreadId, outerThreadId); syncContext.Verify(sc => sc.Post(It.IsAny<SendOrPostCallback>(), null), Times.Once()); }); }
public Task Catch_WithInputValue_IncompleteTaskOfSuccess_DoesNotRunContinuationAndDoesNotSwitchContexts() { // Arrange bool ranContinuation = false; var syncContext = new Mock<SynchronizationContext> { CallBase = true }; SynchronizationContext.SetSynchronizationContext(syncContext.Object); Task<int> incompleteTask = new Task<int>(() => 42); // Act Task<int> resultTask = incompleteTask.Catch(info => { ranContinuation = true; return info.Handled(42); }); // Assert incompleteTask.Start(); return resultTask.ContinueWith(task => { Assert.False(ranContinuation); syncContext.Verify(sc => sc.Post(It.IsAny<SendOrPostCallback>(), null), Times.Never()); }); }
// catch without returning value public static Task Catch <T>(this Task <T> task, Action <Exception> action) where T : class { return((Task)task.Catch <T>(ex => { action(ex); return null; })); }
public static Task <T> Catch <TException, T>(this Task <T> self, Func <TException, T> catchProc, bool continueOnCapturedContext = false) where TException : Exception => self.Catch((TException e) => Task.FromResult(catchProc(e)), continueOnCapturedContext);