andrew4582

RequestResourceTracker

Mar 8th, 2011
289
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 1.85 KB | None | 0 0
  1. using System.Collections.Generic;
  2.  
  3.     internal static class RequestResourceTracker {
  4.         private static readonly object _resourcesKey = new object();
  5.  
  6.         private static List<SecureWeakReference> GetResources(HttpContextBase context) {
  7.             var resources = (List<SecureWeakReference>)context.Items[_resourcesKey];
  8.             if (resources == null) {
  9.                 resources = new List<SecureWeakReference>();
  10.                 context.Items[_resourcesKey] = resources;
  11.             }
  12.  
  13.             return resources;
  14.         }
  15.  
  16.         internal static void DisposeResources(HttpContextBase context) {
  17.             var resources = GetResources(context);
  18.             if (resources != null) {
  19.                 resources.ForEach(resource => resource.Dispose());
  20.                 resources.Clear();
  21.             }
  22.         }
  23.  
  24.         internal static void RegisterForDispose(HttpContextBase context, IDisposable resource) {
  25.             var resources = GetResources(context);
  26.             if (resources != null) {
  27.                 resources.Add(new SecureWeakReference(resource));
  28.             }
  29.         }
  30.  
  31.         internal static void RegisterForDispose(IDisposable resource) {
  32.             var context = HttpContext.Current;
  33.             if (context != null) {
  34.                 RegisterForDispose(new HttpContextWrapper(context), resource);
  35.             }
  36.         }
  37.  
  38.         private sealed class SecureWeakReference {
  39.             private readonly WeakReference _reference;
  40.             public SecureWeakReference(IDisposable reference) {
  41.                 _reference = new WeakReference(reference);
  42.             }
  43.  
  44.             internal void Dispose() {
  45.                 var disposable = (IDisposable)_reference.Target;
  46.                 if (disposable != null) {
  47.                     disposable.Dispose();
  48.                 }
  49.             }
  50.         }
  51.     }
Advertisement
Add Comment
Please, Sign In to add comment