Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / wpf / src / Shared / MS / Internal / AppDomainShutdownMonitor.cs / 1 / AppDomainShutdownMonitor.cs
//---------------------------------------------------------------------------- // //// Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // Implement IAddDomainShutdownListener and use AppDomainShutdownMonitor // to know when the AppDomain is going down // //--------------------------------------------------------------------------- using System; using System.Diagnostics; // Assert using System.Collections.Generic; // Dictionary using System.Threading; // [ThreadStatic] namespace MS.Internal { internal interface IAppDomainShutdownListener { void NotifyShutdown(); } internal static class AppDomainShutdownMonitor { static AppDomainShutdownMonitor() { AppDomain.CurrentDomain.DomainUnload += OnShutdown; AppDomain.CurrentDomain.ProcessExit += OnShutdown; _dictionary = new Dictionary(); } public static void Add(WeakReference listener) { Debug.Assert(listener.Target != null); Debug.Assert(listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Add(listener, listener); } } } public static void Remove(WeakReference listener) { Debug.Assert(listener.Target == null || listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Remove(listener); } } } private static void OnShutdown(object sender, EventArgs e) { lock (_dictionary) { // Setting this to true prevents Add and Remove from modifying the list. This // way we call out without holding a lock (which would be bad) _shuttingDown = true; } foreach (WeakReference value in _dictionary.Values) { IAppDomainShutdownListener listener = value.Target as IAppDomainShutdownListener; if (listener != null) { listener.NotifyShutdown(); } } } private static Dictionary _dictionary; private static bool _shuttingDown; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved. //---------------------------------------------------------------------------- // // // Copyright (C) Microsoft Corporation. All rights reserved. // // // Description: // Implement IAddDomainShutdownListener and use AppDomainShutdownMonitor // to know when the AppDomain is going down // //--------------------------------------------------------------------------- using System; using System.Diagnostics; // Assert using System.Collections.Generic; // Dictionary using System.Threading; // [ThreadStatic] namespace MS.Internal { internal interface IAppDomainShutdownListener { void NotifyShutdown(); } internal static class AppDomainShutdownMonitor { static AppDomainShutdownMonitor() { AppDomain.CurrentDomain.DomainUnload += OnShutdown; AppDomain.CurrentDomain.ProcessExit += OnShutdown; _dictionary = new Dictionary(); } public static void Add(WeakReference listener) { Debug.Assert(listener.Target != null); Debug.Assert(listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Add(listener, listener); } } } public static void Remove(WeakReference listener) { Debug.Assert(listener.Target == null || listener.Target is IAppDomainShutdownListener); lock (_dictionary) { if (!_shuttingDown) { _dictionary.Remove(listener); } } } private static void OnShutdown(object sender, EventArgs e) { lock (_dictionary) { // Setting this to true prevents Add and Remove from modifying the list. This // way we call out without holding a lock (which would be bad) _shuttingDown = true; } foreach (WeakReference value in _dictionary.Values) { IAppDomainShutdownListener listener = value.Target as IAppDomainShutdownListener; if (listener != null) { listener.NotifyShutdown(); } } } private static Dictionary _dictionary; private static bool _shuttingDown; } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // Copyright (c) Microsoft Corporation. All rights reserved.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EndPoint.cs
- MultiPageTextView.cs
- XmlSerializerNamespaces.cs
- PropertyRef.cs
- BufferedReceiveManager.cs
- ServiceReference.cs
- SecurityTokenValidationException.cs
- SqlFunctionAttribute.cs
- RegexInterpreter.cs
- Root.cs
- Canvas.cs
- SynchronizedInputPattern.cs
- Descriptor.cs
- DetectEofStream.cs
- HttpRuntimeSection.cs
- HiddenField.cs
- PaginationProgressEventArgs.cs
- ImageIndexConverter.cs
- GeneralTransform3DTo2DTo3D.cs
- TextTreeUndo.cs
- ToolStripItemTextRenderEventArgs.cs
- Stopwatch.cs
- RefExpr.cs
- LogStream.cs
- DynamicMethod.cs
- PropertyKey.cs
- ImageMap.cs
- PublishLicense.cs
- HyperLinkColumn.cs
- SecurityAttributeGenerationHelper.cs
- AutoScrollExpandMessageFilter.cs
- BasicHttpBinding.cs
- ManagedWndProcTracker.cs
- DataAdapter.cs
- XmlSchemas.cs
- HitTestResult.cs
- RectangleF.cs
- WebException.cs
- Effect.cs
- CryptoStream.cs
- Semaphore.cs
- FileIOPermission.cs
- EntitySetBaseCollection.cs
- AlphabeticalEnumConverter.cs
- DbTransaction.cs
- PointLightBase.cs
- Touch.cs
- Solver.cs
- ToolStripPanel.cs
- CleanUpVirtualizedItemEventArgs.cs
- InternalMappingException.cs
- BitmapImage.cs
- ReceiveErrorHandling.cs
- SpecialNameAttribute.cs
- Transactions.cs
- ValueUnavailableException.cs
- CornerRadius.cs
- ConsoleKeyInfo.cs
- ClientUrlResolverWrapper.cs
- QilStrConcatenator.cs
- XmlNamespaceMapping.cs
- TimeZone.cs
- LoginName.cs
- Localizer.cs
- SpecialNameAttribute.cs
- TransformGroup.cs
- CodeIndexerExpression.cs
- HealthMonitoringSectionHelper.cs
- WmiInstallComponent.cs
- RSAProtectedConfigurationProvider.cs
- CompareValidator.cs
- AdCreatedEventArgs.cs
- ProtocolsConfiguration.cs
- SqlParameterCollection.cs
- OutputCacheModule.cs
- wmiprovider.cs
- ParagraphResult.cs
- HashRepartitionEnumerator.cs
- DateTimePicker.cs
- CodeAttachEventStatement.cs
- DataGridRelationshipRow.cs
- AnimatedTypeHelpers.cs
- TreeNodeSelectionProcessor.cs
- WebZoneDesigner.cs
- XPathPatternParser.cs
- KoreanCalendar.cs
- PreservationFileReader.cs
- MobileControlBuilder.cs
- ToolStripDropDownButton.cs
- DataGridViewRowCancelEventArgs.cs
- ToolStripPanelSelectionBehavior.cs
- BamlReader.cs
- DesigntimeLicenseContextSerializer.cs
- TypeToArgumentTypeConverter.cs
- WinEventHandler.cs
- QueryValue.cs
- DefaultEventAttribute.cs
- CryptoHandle.cs
- ModelToObjectValueConverter.cs
- _HTTPDateParse.cs