Threading Task оптимизация
Задача: при инициализации комнаты, в которой есть только 2 игрока, запускается задача, с методом, который описан ниже. Это тик обновления. Нужно вызывать обновление у двух игроков, при этом чтобы один не ожидал другого. В обновлениях могут быть долгие операции, такие как расчет скорости атаки и т д.
Правильно ли я реализовал подобный метод? Что будет слышно по оптимизации, когда таких комнат будет 10 тысяч?
private async Task InternalTick()
{
while (true)
{
for (int iterator = 0; iterator < _queueModels.Count; iterator++)
Task.Run(async () => await _queueModels[iterator].TickAsync());
await Task.Delay(_timeUpdateOneFrameInTheMap, _cancellationTokenSource.Token);
}
}
Ответы (1 шт):
Автор решения: aepot
→ Ссылка
Как-то так получистя
private async Task InternalTick()
{
CancellationToken token = _cancellationTokenSource.Token;
int interval = _timeUpdateOneFrameInTheMap;
Stopwatch sw = new Stopwatch();
while (true)
{
sw.Restart();
await Task.WhenAll(_queueModels.Select(x => x.TickAsync()));
int delay = interval - (int)sw.ElapsedMilliseconds;
if (delay > 0)
await Task.Delay(delay, token);
else
token.ThrowIfCancellationRequested();
}
}
Секундомер будет компенсировать время, затраченное на работу и вычитать его от общего промежутка времени. Простая математика.