Асинхронное завершение и утилизацияC#

Место общения программистов C#
Ответить
Anonymous
 Асинхронное завершение и утилизация

Сообщение Anonymous »

У меня есть класс, который используется для начала асинхронной работы.
Когда дело доходит до утилизации этого класса, мне нужно убедиться, что все задачи выполнены первое.

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

IAsyncDisposable

[*]

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

Complete()
с отдельным завершением task
[*]

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

Complete()
с отдельным завершением задача, а затем также Dispose () ?

Каковы ловушки использования чего -то подобного следующее? < /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();
}
}

В качестве вторичного вопроса мне также интересно, следует ли мне реализовать Idispose с помощью блокировки ожидания ситуаций, когда вызывающий код находится в синхронном контексте?

Подробнее здесь: https://stackoverflow.com/questions/794 ... d-disposal
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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