public void DisposeNativeResourcesDisposed_Dispose() { var nativeResourcesDisposed = false; var instance = new ActionDisposable(null, () => nativeResourcesDisposed = true); instance.Dispose(); Assert.True(nativeResourcesDisposed); }
public void DisposeManagedResources_Dispose() { var managedResourcesDisposed = false; var instance = new ActionDisposable(() => managedResourcesDisposed = true); instance.Dispose(); Assert.True(managedResourcesDisposed); }
public IDisposable Stream(int id, Action <Message> action, IObserver <ConnectionState> observer) { var streamer = new Streamer(id, action, observer); _streamers.Add(streamer); return(ActionDisposable.Create(() => _streamers.Remove(streamer))); }
public void ConstructsWithAction() { bool onEnterCalled = false; Action onEnter = () => { onEnterCalled = true; }; var disposable = new ActionDisposable(onEnter, () => { }); Assert.True(onEnterCalled); }
public void EnsureActionCalledOnDispose() { var called = false; using (var disposable = new ActionDisposable(() => called = true)) { } Assert.IsTrue(called); }
public void Start() { _textBox.Unloaded += HandleTextBoxUnloaded; _textBox.PreviewKeyDown += HandleTextPreviewKeyDown; CommandManager.AddPreviewExecutedHandler(_textBox, HandleTextBoxCommandPreviewExecuted); _cleanup = new ActionDisposable(); _cleanup.Add(() => _textBox.Unloaded -= HandleTextBoxUnloaded); _cleanup.Add(() => _textBox.PreviewKeyDown -= HandleTextPreviewKeyDown); _cleanup.Add(() => CommandManager.RemovePreviewExecutedHandler(_textBox, HandleTextBoxCommandPreviewExecuted)); }
public void DisposesWithAction() { bool onLeaveCalled = false; Action onLeave = () => { onLeaveCalled = true; }; var disposable = new ActionDisposable(() => { }, onLeave); Assert.False(onLeaveCalled); disposable.Dispose(); Assert.True(onLeaveCalled); }
public void ExecuteActionWhenDisposed() { // Arrange var flag = false; var action = new Action(() => flag = true); var actionDisposable = new ActionDisposable(action); // Act actionDisposable.Dispose(); // Assert flag.Should().BeTrue(); }
public void Should_call_dispose_action_once() { var x = 0; var d = new ActionDisposable(() => x++); x.Should().Be(0); d.Dispose(); x.Should().Be(1); d.Dispose(); x.Should().Be(1); }
public void Should_not_crash_on_components_dispose_errors() { var check = ""; var app = new DisposableApplication(); var component1 = new ActionDisposable(() => throw new Exception("crash")); var component2 = new ActionDisposable(() => check += "2"); var host = new VostokHost(new TestHostSettings(app, setup => { SetupEnvironment(setup); setup.SetupHostExtensions(e => e.AddDisposable("2", component2)); setup.SetupHostExtensions(e => e.AddDisposable("1", component1)); })); host.Run().State.Should().Be(VostokApplicationState.Exited); check.Should().Be("2"); }
public void Should_dispose_components_with_reverse_order() { var check = ""; var app = new DisposableApplication(); var component1 = new ActionDisposable(() => check += "1"); var component2 = new ActionDisposable(() => check += "2"); var host = new VostokHost(new TestHostSettings(app, setup => { SetupEnvironment(setup); setup.SetupHostExtensions(e => e.AddDisposable("2", component2)); setup.SetupHostExtensions(e => e.AddDisposable("1", component1)); })); host.Run().State.Should().Be(VostokApplicationState.Exited); app.Disposed.Should().BeTrue(); check.Should().Be("12"); }
public static IDisposable PreviewModeCookie(this HttpContextBase context) { var disposable = new ActionDisposable(() => { var cookie = GetPreviewModeCookie(context, false); if (cookie != null) { if (!cookie.HasKeys) { cookie.Expires = DateTime.UtcNow.AddYears(-10); } else { cookie.Expires = DateTime.UtcNow.AddMinutes(20); } context.Response.SetCookie(cookie); } }); return(disposable); }
public void Should_not_block_on_components_dispose_longer_than_dispose_timeout_allows() { var app = new DisposableApplication(); var component = new ActionDisposable(() => Thread.Sleep(10.Seconds())); var host = new VostokHost(new TestHostSettings(app, setup => { SetupEnvironment(setup); setup.SetupHostExtensions(e => e.AddDisposable(component)); setup.SetupShutdownTimeout(1.Minutes()); }) { DisposeComponentTimeout = 1.Seconds() }); var watch = Stopwatch.StartNew(); host.Run().State.Should().Be(VostokApplicationState.Exited); watch.Elapsed.Should().BeLessThan(5.Seconds()); }
public IDisposable BeginScope(string key, bool independent = false) { if (Current?.Key == key) { // Void if parent scope has the same key. return(ActionDisposable.Empty); } _stack.Push(new CacheScope(key)); var action = new ActionDisposable(() => { _stack.TryPop(out _); if (!independent) { PropagateKey(key); } }); return(action); }
public IDisposable Subscribe <T>(Action <T> handler) { if (handler == null) { throw new ArgumentNullException("handler"); } lock (m_Subscriptions) { if (!m_Subscriptions.Contains(handler)) { m_Subscriptions.Add(handler); } } return(ActionDisposable.Create(() => { lock (m_Subscriptions) { m_Subscriptions.Remove(handler); } })); }
public void Constructor_no_actions_no_exceptions() { var instance = new ActionDisposable(null); instance.Dispose(); }
public virtual async Task RebuildAsync(XmlSitemapBuildContext ctx) { Guard.NotNull(ctx, nameof(ctx)); var languageData = new Dictionary <int, LanguageData>(); foreach (var language in ctx.Languages) { var lockFilePath = GetLockFilePath(ctx.Store.Id, language.Id); if (_lockFileManager.TryAcquireLock(lockFilePath, out var lockFile)) { // Process only languages that are unlocked right now // It is possible that an HTTP request triggered the generation // of a language specific sitemap. var sitemapDir = BuildSitemapDirPath(ctx.Store.Id, language.Id); var data = new LanguageData { Store = ctx.Store, Language = language, LockFile = lockFile, LockFilePath = lockFilePath, TempDir = sitemapDir + "~", FinalDir = sitemapDir, BaseUrl = BuildBaseUrl(ctx.Store, language) }; _tenantFolder.TryDeleteDirectory(data.TempDir); _tenantFolder.CreateDirectory(data.TempDir); languageData[language.Id] = data; } } if (languageData.Count == 0) { Logger.Warn("XML sitemap rebuild already in process."); return; } var languages = languageData.Values.Select(x => x.Language); var languageIds = languages.Select(x => x.Id).Concat(new[] { 0 }).ToArray(); // All sitemaps grouped by language var sitemaps = new Multimap <int, XmlSitemapNode>(); var compositeFileLock = new ActionDisposable(() => { foreach (var data in languageData.Values) { data.LockFile.Release(); } }); using (compositeFileLock) { // Impersonate var prevCustomer = _services.WorkContext.CurrentCustomer; // no need to vary xml sitemap by customer roles: it's relevant to crawlers only. _services.WorkContext.CurrentCustomer = _customerService.GetCustomerBySystemName(SystemCustomerNames.SearchEngine); try { var nodes = new List <XmlSitemapNode>(); var queries = CreateQueries(ctx); var total = await queries.GetTotalRecordCountAsync(); var totalSegments = (int)Math.Ceiling(total / (double)MaximumSiteMapNodeCount); var hasIndex = totalSegments > 1; var indexNodes = new Multimap <int, XmlSitemapNode>(); var segment = 0; var numProcessed = 0; CheckSitemapCount(totalSegments); using (new DbContextScope(autoDetectChanges: false, forceNoTracking: true, proxyCreation: false, lazyLoading: false)) { var entities = await EnumerateEntitiesAsync(queries); foreach (var batch in entities.Slice(MaximumSiteMapNodeCount)) { if (ctx.CancellationToken.IsCancellationRequested) { break; } segment++; numProcessed = segment * MaximumSiteMapNodeCount; ctx.ProgressCallback?.Invoke(numProcessed, total, "{0} / {1}".FormatCurrent(numProcessed, total)); var firstEntityName = batch.First().EntityName; var lastEntityName = batch.Last().EntityName; var slugs = GetUrlRecordCollectionsForBatch(batch, languageIds); foreach (var data in languageData.Values) { var language = data.Language; var baseUrl = data.BaseUrl; // Create all node entries for this segment sitemaps[language.Id].AddRange(batch.Select(x => new XmlSitemapNode { LastMod = x.LastMod, Loc = BuildNodeUrl(baseUrl, x, slugs[x.EntityName], language) })); // Create index node for this segment/language combination if (hasIndex) { indexNodes[language.Id].Add(new XmlSitemapNode { LastMod = sitemaps[language.Id].Select(x => x.LastMod).Where(x => x.HasValue).DefaultIfEmpty().Max(), Loc = GetSitemapIndexUrl(segment, baseUrl), }); } if (segment % 5 == 0 || segment == totalSegments) { // Commit every 5th segment (10.000 nodes) temporarily to disk to minimize RAM usage var documents = GetSiteMapDocuments((IReadOnlyCollection <XmlSitemapNode>)sitemaps[language.Id]); await SaveTempAsync(documents, data, segment - documents.Count + (hasIndex ? 1 : 0)); documents.Clear(); sitemaps.RemoveAll(language.Id); } } slugs.Clear(); //GC.Collect(); //GC.WaitForPendingFinalizers(); } // Process custom nodes if (!ctx.CancellationToken.IsCancellationRequested) { ctx.ProgressCallback?.Invoke(numProcessed, total, "Processing custom nodes".FormatCurrent(numProcessed, total)); ProcessCustomNodes(ctx, sitemaps); foreach (var data in languageData.Values) { if (sitemaps.ContainsKey(data.Language.Id) && sitemaps[data.Language.Id].Count > 0) { var documents = GetSiteMapDocuments((IReadOnlyCollection <XmlSitemapNode>)sitemaps[data.Language.Id]); await SaveTempAsync(documents, data, (segment + 1) - documents.Count + (hasIndex ? 1 : 0)); } else if (segment == 0) { // Ensure that at least one entry exists. Otherwise, // the system will try to rebuild again. var homeNode = new XmlSitemapNode { LastMod = DateTime.UtcNow, Loc = data.BaseUrl }; var documents = GetSiteMapDocuments(new List <XmlSitemapNode> { homeNode }); await SaveTempAsync(documents, data, 0); } } } } ctx.CancellationToken.ThrowIfCancellationRequested(); ctx.ProgressCallback?.Invoke(totalSegments, totalSegments, "Finalizing...'"); foreach (var data in languageData.Values) { // Create index documents (if any) if (hasIndex && indexNodes.Any()) { var indexDocument = CreateSitemapIndexDocument(indexNodes[data.Language.Id]); await SaveTempAsync(new List <string> { indexDocument }, data, 0); } // Save finally (actually renames temp folder) SaveFinal(data); } } finally { // Undo impersonation _services.WorkContext.CurrentCustomer = prevCustomer; sitemaps.Clear(); foreach (var data in languageData.Values) { if (_tenantFolder.DirectoryExists(data.TempDir)) { _tenantFolder.TryDeleteDirectory(data.TempDir); } } //GC.Collect(); //GC.WaitForPendingFinalizers(); } } }
string M4(ActionDisposable <int> i, ActionDisposable <long> l, float f) => "";
[Factory] ActionDisposable <long> M2(ActionDisposable <int> dep) => new ActionDisposable <long>(() => LongDisposed = true);
public void HandleNavigated(ShellNavigatedEventArgs args) { _waitingForWindow?.Dispose(); _waitingForWindow = null; // we don't want to fire Navigated until shell is attached to an actual window if (_shell.Window == null || _shell.CurrentPage == null) { _shell.PropertyChanged += WaitForWindowToSet; var shellContent = _shell?.CurrentItem?.CurrentItem?.CurrentItem; if (shellContent != null) { shellContent.ChildAdded += WaitForWindowToSet; } _waitingForWindow = new ActionDisposable(() => { _shell.PropertyChanged -= WaitForWindowToSet; if (shellContent != null) { shellContent.ChildAdded -= WaitForWindowToSet; } }); void WaitForWindowToSet(object sender, EventArgs e) { if (_shell.Window != null && _shell.CurrentPage != null) { _waitingForWindow?.Dispose(); _waitingForWindow = null; _shell.CurrentItem?.SendAppearing(); HandleNavigated(args); } } return; } if (AccumulateNavigatedEvents) { if (_accumulatedEvent == null) { _accumulatedEvent = args; } } else { _accumulatedEvent = null; BaseShellItem baseShellItem = _shell.CurrentItem?.CurrentItem?.CurrentItem; if (baseShellItem != null) { baseShellItem.OnAppearing(() => { FireNavigatedEvents(args, _shell); }); } else { FireNavigatedEvents(args, _shell); } void FireNavigatedEvents(ShellNavigatedEventArgs a, Shell shell) { Navigated?.Invoke(this, args); // reset active page route tree Routing.ClearImplicitPageRoutes(); Routing.RegisterImplicitPageRoutes(_shell); } } }
[Factory] ActionDisposable <string> M3(ActionDisposable <long> dep) => throw new Exception();