Code:
/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / Orcas / SP / 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
- ExpressionConverter.cs
- HelpKeywordAttribute.cs
- XmlnsDictionary.cs
- ObsoleteAttribute.cs
- AttributeInfo.cs
- ActivitySurrogate.cs
- HttpProfileGroupBase.cs
- Context.cs
- TagPrefixInfo.cs
- PnrpPermission.cs
- PathData.cs
- StylusButton.cs
- QuaternionRotation3D.cs
- WindowsRegion.cs
- SqlConnectionString.cs
- ScrollPatternIdentifiers.cs
- sqlcontext.cs
- PropertyCollection.cs
- XmlAtomicValue.cs
- XmlFormatExtensionAttribute.cs
- filewebrequest.cs
- BreakRecordTable.cs
- OleDbRowUpdatingEvent.cs
- AdornerLayer.cs
- IsolatedStorageFile.cs
- URIFormatException.cs
- DataGridDesigner.cs
- ConfigurationElementProperty.cs
- SparseMemoryStream.cs
- StorageModelBuildProvider.cs
- SynchronousChannelMergeEnumerator.cs
- CodeIterationStatement.cs
- EmptyControlCollection.cs
- SharedConnectionInfo.cs
- VectorConverter.cs
- Simplifier.cs
- ProxyElement.cs
- EventLogRecord.cs
- CombinedHttpChannel.cs
- RegexCapture.cs
- HtmlInputButton.cs
- XmlFormatWriterGenerator.cs
- EditorZoneBase.cs
- FormViewDeletedEventArgs.cs
- CheckBox.cs
- UriExt.cs
- XmlDataProvider.cs
- ColorMatrix.cs
- StylesEditorDialog.cs
- BaseParser.cs
- MarkupProperty.cs
- EventBuilder.cs
- EncoderNLS.cs
- RangeValuePattern.cs
- DataSourceHelper.cs
- RayHitTestParameters.cs
- RotateTransform.cs
- KeyConstraint.cs
- StylusCaptureWithinProperty.cs
- Int64Storage.cs
- SiteMapProvider.cs
- ProcessHostMapPath.cs
- StorageMappingFragment.cs
- AutomationProperty.cs
- EncryptedKeyIdentifierClause.cs
- FixedTextView.cs
- ControlUtil.cs
- SplitterPanel.cs
- SqlBulkCopyColumnMappingCollection.cs
- DoubleAnimationClockResource.cs
- Token.cs
- VariableAction.cs
- LinqDataSourceContextEventArgs.cs
- OperatingSystem.cs
- HttpModuleActionCollection.cs
- BinaryObjectInfo.cs
- KeyValueConfigurationCollection.cs
- GeometryGroup.cs
- RsaSecurityTokenAuthenticator.cs
- SignatureResourcePool.cs
- X509ChainElement.cs
- ParserStreamGeometryContext.cs
- ViewEvent.cs
- AuthStoreRoleProvider.cs
- SafeFindHandle.cs
- Activator.cs
- SafeTokenHandle.cs
- CellLabel.cs
- MouseActionValueSerializer.cs
- EpmSyndicationContentSerializer.cs
- ServiceX509SecurityTokenProvider.cs
- MexServiceChannelBuilder.cs
- DesignerEventService.cs
- ItemChangedEventArgs.cs
- XdrBuilder.cs
- SmiXetterAccessMap.cs
- _IPv4Address.cs
- LinearGradientBrush.cs
- PackageRelationshipSelector.cs
- StatusBarDrawItemEvent.cs