private bool disposedValue = false;         // To detect redundant calls

        protected virtual async ValueTask Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    if (OnDisposed.HasDelegate)
                    {
                        await OnDisposed.InvokeAsync(EventArgs.Empty);
                    }
                }

                disposedValue = true;
            }
        }