Подождать внутри длительного цикла фоновых задач, чтобы условие/событие продолжило итерацию?C#

Место общения программистов C#
Ответить
Anonymous
 Подождать внутри длительного цикла фоновых задач, чтобы условие/событие продолжило итерацию?

Сообщение Anonymous »

Рассмотрим этот игрушечный пример:

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

public class SomeClass
{
private readonly ConcurrentQueue _sharedData = [];
private Task? _backgroundTask;

private async Task Start()
{

CancellationTokenSource cts = new();
_backgroundTask = Task.Run(() => BackgroundWork(cts.Token));

for (int i = 0; i < 100; i++)
{

_sharedData.TryDequeue(out int data);
Status = string.Join(", ", _sharedData.Select(a => a.ToString()));
await Task.Delay(300);
}
cts.Cancel();
}

private async Task BackgroundWork(CancellationToken ct)
{
while (!ct.IsCancellationRequested)
{
if (_sharedData.Count >= 5)
{
await Task.Delay(250);
continue;
}

_sharedData.Enqueue(Random.Shared.Next());

}

Status = "bg task done.";
}
}
Мне интересно, есть ли пример «лучшей практики», позволяющий избежать Task.Delay() в фоновом рабочем цикле. По сути, мне не нравится идея постоянного зацикливания до тех пор, пока количество очередей не станет ниже порогового значения. Я бы предпочел, чтобы какое-то событие инициировало продолжение.
Контекст
В реальном приложении основной цикл работает с файлами, загружаемыми из центральный сервер. Чтобы сократить время ожидания, я хочу предварительно кэшировать следующую пару файлов, пока пользователь работает с текущим.

Подробнее здесь: https://stackoverflow.com/questions/792 ... ontinue-it
Ответить

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

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

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

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

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