Каналы с отмена ⇐ C#

Место общения программистов C#
Anonymous
Каналы с отмена

Сообщение Anonymous »

Полный воспроизводимый код находится на GitHub, память скоро будет ракету после запуска исполняемого файла. Код находится в основном в классе Asyncblockqueue.cs .

Код: Выделить всё

        public async Task DequeueAsync(
int timeoutInMs = -1,
CancellationToken cancellationToken = default)
{
try
{
using (CancellationTokenSource cts = this.GetCancellationTokenSource(timeoutInMs, cancellationToken))
{
T value = await this._channel.Reader.ReadAsync(cts?.Token ?? cancellationToken).ConfigureAwait(false);
return value;
}
}
catch (ChannelClosedException cce)
{
await Console.Error.WriteLineAsync("Channel is closed.");
throw new ObjectDisposedException("Queue is disposed");
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
await Console.Error.WriteLineAsync("Dequeue failed.");
throw;
}
}

private CancellationTokenSource GetCancellationTokenSource(
int timeoutInMs,
CancellationToken cancellationToken)
{
if (timeoutInMs 
При использовании таким образом у него есть утечки памяти: < /p>
try
{
string message = await this._inputQueue.DequeueAsync(10,cancellationToken).ConfigureAwait(false);
}
catch(OperationCanceledException){
// timeout
}


Подробнее здесь: https://stackoverflow.com/questions/675 ... er-dispose

Вернуться в «C#»