0

新しい windsor3 perfmonace カウンターが、TypedFactory によって生成されたオブジェクトの追跡をどのように表示するかについて混乱しています。

次のシナリオを検討する

public interface IBFactory
{
    IB[] GetAll();
    void FreeUp(IB cmps);
}

public class B1 : IB, IDisposable
{
    public void Add(int i){}

    public void Dispose()
    {
        Console.WriteLine("Disposing " + GetType().Name);
    }
}

public class B2 : IB, IDisposable
{
    public void Add(int i){}

    public void Dispose()
    {
        Console.WriteLine("Disposing " + GetType().Name);
    }
}

public class B3 : IB
{
    public void Add(int i){}

    public void Dispose()
    {
        Console.WriteLine("Disposing " + GetType().Name);
    }
}


 var container = new WindsorContainer();

 var diagnostic = LifecycledComponentsReleasePolicy.GetTrackedComponentsDiagnostic(container.Kernel);
 var counter = LifecycledComponentsReleasePolicy.GetTrackedComponentsPerformanceCounter(new PerformanceMetricsFactory());
 container.Kernel.ReleasePolicy = new LifecycledComponentsReleasePolicy(diagnostic, counter);

 Console.WriteLine("Enter number of iterations:");
 int iterations = int.Parse(Console.ReadLine());

 container.AddFacility<TypedFactoryFacility>();
 container.Register
 (
    Component.For<IBFactory>()
        .AsFactory()
        .LifeStyle.Transient,

    Classes.FromAssemblyContaining<IB>()
        .BasedOn(typeof(IB))
        .WithService.Base()
        .Configure(c => c.LifestyleTransient())
 );

 Console.WriteLine("Create Memory Leak Y or N?");
 var leak = Console.ReadLine().ToUpper() == "Y";


 var sleepFor = 100;// int.Parse(Console.ReadLine());

 for (var i = 1; i < iterations+1; i++)
 {
    var factory = container.Resolve<IBFactory>();
    Console.WriteLine("Factory created.");

    var cmp = factory.GetAll();
    foreach (var b in cmp)
    {
        b.Add(i);
    }

    Console.WriteLine("Iteration {0} completed", i);

    Thread.Sleep(sleepFor);

    if (!leak)
    {
        foreach (var b in cmp)
        {
            factory.FreeUp(b);
        }
    }

    Console.WriteLine("Releasing factory.");
    container.Release(factory);     
 }

 Console.WriteLine("container disposing.....");
 container.Dispose();
 Console.WriteLine("container disposed");
 Console.ReadLine();

必要に応じて FreeUp ファクトリ メソッドを使用してオブジェクトを破棄すると、perf カウンターは予想される追跡を示します。

代わりに、明示的にオブジェクトを破棄せず、テスト目的で一時的に作成されたファクトリを暗黙的に破棄する場合、(ドキュメントに従って) ファクトリを破棄すると IB インスタンスが破棄されますが、パフォーマンス カウンターは更新されず、 IBインスタンスがまだ追跡されていることを示しています...

それはどういう意味ですか?ファクトリの破棄により IB インスタンスで Dispose が呼び出された場合でも、Perf カウンターが更新されていないか、オブジェクトがまだ追跡されています (これは非常に恐ろしいことです)。

4

0 に答える 0