IDisposeBelatable
IDisposeBelatable is an interface for objects whose dispose can be delayed.
/// <summary>Interface for objects whose dispose can be belated. </summary>
public interface IDisposeBelatable : IDisposable
{
/// <summary>Try creates a handle that postpones the dispose of the object until all the belate-handles have been disposed.</summary>
/// <returns>belating handle that must be diposed</returns>
bool TryBelateDispose([NotNullWhen(true)] out IDisposable? belateHandle);
}
.BelateHandle() extension method (namespace Avalanche.Utilities, Avalanche.Utilities.Abstractions.dll) creates a handle that postpones dispose on .Dispose(). Actual dispose proceeds when .Dispose() is called and all belate handles are disposed. This enables a way to share or pass on ownership.
// Create something disposable
MyClass obj = new MyClass();
// Belate handle for closure
IDisposable belateHandle = obj.BelateDispose();
// Pass 'obj' for concurrent thread
Task.Run(() =>
{
// Do work
Thread.Sleep(1000);
//
belateHandle.Dispose();
});
// Do work with 'obj'...
// Dispose 'obj'.
obj.Dispose();
DisposeAttachable can be used as base class for classes that implement IDisposeBelatable.
public class MyClass : DisposeAttachable, IDisposeBelatable
{
}
Full Example
Full example
using System;
using System.Threading;
using System.Threading.Tasks;
using Avalanche.Utilities;
class disposebelatable
{
public static void Run()
{
// <01>
// Create something disposable
MyClass obj = new MyClass();
// Belate handle for closure
IDisposable belateHandle = obj.BelateDispose();
// Pass 'obj' for concurrent thread
Task.Run(() =>
{
// Do work
Thread.Sleep(1000);
//
belateHandle.Dispose();
});
// Do work with 'obj'...
// Dispose 'obj'.
obj.Dispose();
// </01>
}
// <10>
public class MyClass : DisposeAttachable, IDisposeBelatable
{
}
// </10>
}