Esempio n. 1
0
        public void DisposeNativeResourcesDisposed_Dispose()
        {
            var nativeResourcesDisposed = false;
            var instance = new ActionDisposable(null, () => nativeResourcesDisposed = true);

            instance.Dispose();
            Assert.True(nativeResourcesDisposed);
        }
Esempio n. 2
0
        public void DisposeManagedResources_Dispose()
        {
            var managedResourcesDisposed = false;
            var instance = new ActionDisposable(() => managedResourcesDisposed = true);

            instance.Dispose();
            Assert.True(managedResourcesDisposed);
        }
Esempio n. 3
0
        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)));
        }
Esempio n. 4
0
        public void ConstructsWithAction()
        {
            bool   onEnterCalled = false;
            Action onEnter       = () => { onEnterCalled = true; };

            var disposable = new ActionDisposable(onEnter, () => { });

            Assert.True(onEnterCalled);
        }
Esempio n. 5
0
        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));
            }
Esempio n. 7
0
        public void DisposesWithAction()
        {
            bool   onLeaveCalled = false;
            Action onLeave       = () => { onLeaveCalled = true; };

            var disposable = new ActionDisposable(() => { }, onLeave);

            Assert.False(onLeaveCalled);

            disposable.Dispose();
            Assert.True(onLeaveCalled);
        }
Esempio n. 8
0
        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();
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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");
        }
Esempio n. 11
0
        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");
        }
Esempio n. 12
0
        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);
        }
Esempio n. 13
0
        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());
        }
Esempio n. 14
0
        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);
                }
            }));
        }
Esempio n. 16
0
        public void Constructor_no_actions_no_exceptions()
        {
            var instance = new ActionDisposable(null);

            instance.Dispose();
        }
Esempio n. 17
0
        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);
Esempio n. 20
0
        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();