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();
}
}
Комментариев нет:
Отправить комментарий