.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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д