пятница, 5 декабря 2025 г.

Dispose, Examples

Dispose, Examples

F:\Projects\VS\WebService\BusLibrary01\EventHub.cs

F:\Projects\VS\WebService\BusLibrary\EventHub.cs

    // 25.12.05

    public async ValueTask DisposeAsync()

    {

        if (_disposed) return;

        _disposed = true;

        try

        {

            _cts.Cancel();

        }

        catch (ObjectDisposedException)

        {

            // Уже освобожден

            return;

        }

        _channel.Writer.TryComplete();

        try

        {

            // Ждем завершения обработки оставшихся сообщений

            var timeoutTask = Task.Delay(TimeSpan.FromSeconds(dispose_timeout_in_seconds));

            var completedTask = await Task.WhenAny(_pump, timeoutTask).ConfigureAwait(false);

            if (completedTask != _pump)

            {

                // Таймаут - форсируем завершение

                _cts.Cancel();

            }

        }

        catch

        {

            /* ignore */

        }

        finally

        {

            _cts.Dispose();

        }

    }

 25.12.03

public async ValueTask DisposeAsync()

    {

        if (_disposed) return;

        _disposed = true;

        try

        {

            _cts.Cancel();

        }

        catch (ObjectDisposedException)

        {

            return;

        }

        _channel.Writer.TryComplete();

        try

        {

            await _pump.ConfigureAwait(false);

        }

        catch (OperationCanceledException)

        {

            // Ожидаемое исключение при отмене

        }

        catch

        {

            /* ignore */

        }

        finally

        {

            _cts.Dispose();

        }

    }

 25.12.02

public async ValueTask DisposeAsync()

    {

        if (_disposed) return;

        _disposed = true;

        try { _cts.Cancel(); } catch { }

        _channel.Writer.TryComplete();

        try { await _pump.WaitAsync(TimeSpan.FromSeconds(5)); }

        catch { }

        _cts.Dispose();

    }

 25.12.01

public async ValueTask DisposeAsync()

    {

        _cts.Cancel();

        _channel.Writer.TryComplete();

        try { await _pump.ConfigureAwait(false); } catch { /* ignore */ }

        _cts.Dispose();

    }

}