.NET 4.x Асинхронность? - C#
Формулировка задачи:
Уже как то создавал подобную тему, но моя текущая реализация меня не устраивает чуть более чем полностью, создам новую.
Есть у меня некая сущность клиента. В каждом клиенте, на протяжении всей его жизни есть штук 10-15 фоновых сервисов.
сервисы запускаются так
код выполняющийся в тике без всяких сложных вычислений - 5% linq / 90% ожидание (Task.Delay) или типа
Самая главная проблема - сервисы иногда начинают "висеть", причём не в моём коде (иногда до нескольких секунд). Да и потоков всё равно в итоге создается примерно столько же сколько и сервисов, что вообщем то оверхед (для десятка клиентов их будет штук 150).
Собственно, как бы организовать это лучше, чем есть? В идеале мне видится так - на клиент 1-2 рабочих потока, но загруженных по максимуму, т.е. во время ожидания выполняется другая задача. Вариант с ThreadPool как я понял не подойдет, поскольку пока поток находится в состоянии сна, он считается занятым.
protected virtual void CreateInfiniteLoop(Action action, int delay, string name) { Task.Run(() => { while (_isRunning) { Task.Delay(delay).Wait(); if (IsEnabled(name)) action(); else Task.Delay(1000).Wait(); } }); }
public bool Wait(Func<bool> condition, int timeout) { var timeoutTime = Environment.TickCount + timeout; var actionTime = 0; while (IsLoggedIn && (Environment.TickCount < timeoutTime || timeout < 0)) { if (condition()) { return true; } Task.Delay(30).Wait(); } return false; }
Решение задачи: «.NET 4.x Асинхронность?»
textual
Листинг программы
Action action = null; //это делегат "запускатора" Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д