Wenn es um die Entsorgung dieser Klasse geht, muss ich sicherstellen Erstens. < /p>
Es scheint, als ob es einige Muster dafür gibt.
Code: Select all
IAsyncDisposable
[*]
Code: Select all
Complete()
Code: Select all
Complete()
Code: Select all
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();
}
}