Когда дело доходит до утилизации этого класса, мне нужно убедиться, что все задачи выполнены первое.
Код: Выделить всё
IAsyncDisposable[*]
Код: Выделить всё
Complete()[*]
Код: Выделить всё
Complete()Каковы ловушки использования чего -то подобного следующее? < /p>
Код: Выделить всё
public class AsyncWorkHelper
{
private readonly List _tasks = new();
private CancellationTokenSource? _cancellationTokenSource;
private SemaphoreSlim _semaphore = new SemaphoreSlim(1);
private bool _isComplete;
public async Task PushWorkAsync()
{
if (_isComplete)
return;
// ...
}
public async Task CompleteAsync(bool cancel)
{
_isComplete = true;
if (cancel)
_cancellationTokenSource?.Cancel();
// wait for all tasks to finish
await Task.WhenAll(_tasks.ToArray());
// now safe to clean up
_cancellationTokenSource?.Dispose();
_semaphore.Dispose();
}
}
Подробнее здесь: https://stackoverflow.com/questions/794 ... d-disposal
Мобильная версия