Ejemplo n.º 1
0
        public void SetsReferenceToNull()
        {
            IDisposable myDisposable = DisposableFactory.CreateDisposable();

            SafeDispose.DisposeAndSetNull(ref myDisposable);

            Assert.Equal(null, myDisposable);
        }
Ejemplo n.º 2
0
        public void DisposeCalled()
        {
            bool        disposeCalled = false;
            IDisposable myDisposable  = DisposableFactory.CreateDisposable(
                () => disposeCalled = true);

            SafeDispose.DisposeAndSetNull(ref myDisposable);

            Assert.True(disposeCalled);
        }
Ejemplo n.º 3
0
        public void MultipleCallsSameReference()
        {
            int         disposeCount = 0;
            IDisposable myDisposable = DisposableFactory.CreateDisposable(
                () => disposeCount++);

            SafeDispose.DisposeAndSetNull(ref myDisposable);

            // Here it should be null, so nothing will happen, should not throw either
            SafeDispose.DisposeAndSetNull(ref myDisposable);

            Assert.Equal(1, disposeCount);
        }
    public static void Main()
    {
        Console.WriteLine("Hello World");
        var         factory = new DisposableFactory();
        IDisposable d;
        var         success = factory.TryGetDisposable(out d);

        if (success)
        {
            using (d) {
            }
        }

        using (factory.GetDisposableResults().Item2){
        }
    }
Ejemplo n.º 5
0
        public void ThreadSafeMultipleDispose()
        {
            int disposalBegunCount    = 0;
            int disposalCompleteCount = 0;
            var releaseDispose        = new AutoResetEvent(false);

            IDisposable myDisposable = DisposableFactory.CreateDisposable(
                () =>
            {
                disposalBegunCount++;
                releaseDispose.WaitOne();
                disposalCompleteCount++;
            });

            Assert.Equal(0, disposalBegunCount);
            Assert.Equal(0, disposalCompleteCount);

            var dispose1Task = Task.Run(
                () => SafeDispose.DisposeAndSetNull(ref myDisposable));
            var dispose2Task = Task.Run(
                () => SafeDispose.DisposeAndSetNull(ref myDisposable));

            // Give them some time to start up
            Thread.Sleep(TimeSpan.FromSeconds(0.5));

            Assert.Equal(1, disposalBegunCount);
            Assert.Equal(0, disposalCompleteCount);

            releaseDispose.Set();

            // Give the tasks time to finish disposal
            dispose1Task.Wait();
            dispose2Task.Wait();

            Assert.Equal(1, disposalBegunCount);
            Assert.Equal(1, disposalCompleteCount);

            // Extra releases should do nothing
            releaseDispose.Set();
            releaseDispose.Set();
            releaseDispose.Set();

            Assert.Equal(1, disposalBegunCount);
            Assert.Equal(1, disposalCompleteCount);
        }