protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    try
                    {
                        adapter.OnObserve -= Adapter_OnObserve;
                        adapter.Dispose();
                    }
                    catch (Exception ex)
                    {
                        logger?.LogErrorAsync(ex, $"Disposing Orleans adapter fault for {session.Identity}");
                    }

                    coapObserved.Clear();
                    coapUnobserved.Clear();
                    coapObserved   = null;
                    coapUnobserved = null;
                }

                disposedValue = true;
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    adapter.Dispose();
                }

                disposedValue = true;
            }
        }
        protected void Disposing(bool disposing)
        {
            if (!disposed)
            {
                if (disposing)
                {
                    try
                    {
                        if (adapter != null)
                        {
                            adapter.Dispose();
                            logger?.LogDebugAsync($"MQTT adapter disposed on channel {Channel.Id}").GetAwaiter();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger?.LogErrorAsync(ex,
                                              $"MQTT adapter disposing orleans adapter error on channel '{Channel.Id}'.").GetAwaiter();
                    }

                    try
                    {
                        if (Channel != null)
                        {
                            string channelId = Channel.Id;
                            Channel.Dispose();
                            logger?.LogDebugAsync($"MQTT adapter channel {channelId} disposed").GetAwaiter();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger?.LogErrorAsync(ex, $"MQTT adapter Disposing channel on channel '{Channel.Id}'.")
                        .GetAwaiter();
                    }

                    try
                    {
                        if (session != null)
                        {
                            session.Dispose();
                            logger?.LogDebugAsync("MQTT adapter disposed session.");
                        }
                    }
                    catch (Exception ex)
                    {
                        logger?.LogErrorAsync(ex, $"MQTT adapter Disposing session on channel '{Channel.Id}'.")
                        .GetAwaiter();
                    }
                }

                disposed = true;
            }
        }
        protected void Disposing(bool disposing)
        {
            if (!disposed)
            {
                Trace.TraceInformation("MQTT Protocol Adapter disposing on Channel '{0}'.", Channel.Id);
                if (disposing)
                {
                    try
                    {
                        if (adapter != null)
                        {
                            adapter.Dispose();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, $"MQTT adapter Disposing orleans adapter error on channel '{Channel.Id}'.");
                    }

                    try
                    {
                        if (Channel != null)
                        {
                            Channel.Dispose();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, $"MQTT adapter Disposing channel on channel '{Channel.Id}'.");
                    }

                    try
                    {
                        if (session != null)
                        {
                            session.Dispose();
                        }
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, $"MQTT adapter Disposing session on channel '{Channel.Id}'.");
                    }
                }
                disposed = true;
            }
        }
        protected virtual void Dispose(bool disposing)
        {
            if (!disposedValue)
            {
                if (disposing)
                {
                    adapter.OnObserve -= Adapter_OnObserve;
                    adapter.Dispose();
                    coapObserved.Clear();
                    coapUnobserved.Clear();
                    coapObserved   = null;
                    coapUnobserved = null;
                }

                disposedValue = true;
            }
        }