Asynchrone Fertigstellung und Entsorgung
Posted: 15 Feb 2025, 17:07
Ich habe eine Klasse, die verwendet wird, um asynchrones zu arbeiten.
Wenn es um die Entsorgung dieser Klasse geht, muss ich sicherstellen Erstens. < /p>
Es scheint, als ob es einige Muster dafür gibt.
[*] mit separatem Abschluss Aufgabe
mit separater Abschluss Aufgabe und dann auch dispose () ? Folgendes? < /p>
Als sekundäre Frage frage ich mich auch, ob ich iDisis mit einer Blockierung auf Situationen implementieren sollte, in denen sich der Anrufcode in einem synchronen Kontext befindet?
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();
}
}