.NET 4.x Асинхронность? - C#

Узнай цену своей работы

Формулировка задачи:

Уже как то создавал подобную тему, но моя текущая реализация меня не устраивает чуть более чем полностью, создам новую. Есть у меня некая сущность клиента. В каждом клиенте, на протяжении всей его жизни есть штук 10-15 фоновых сервисов. сервисы запускаются так
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();
        }
    });
}
код выполняющийся в тике без всяких сложных вычислений - 5% linq / 90% ожидание (Task.Delay) или типа
    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;
    }
Самая главная проблема - сервисы иногда начинают "висеть", причём не в моём коде (иногда до нескольких секунд). Да и потоков всё равно в итоге создается примерно столько же сколько и сервисов, что вообщем то оверхед (для десятка клиентов их будет штук 150). Собственно, как бы организовать это лучше, чем есть? В идеале мне видится так - на клиент 1-2 рабочих потока, но загруженных по максимуму, т.е. во время ожидания выполняется другая задача. Вариант с ThreadPool как я понял не подойдет, поскольку пока поток находится в состоянии сна, он считается занятым.

Решение задачи: «.NET 4.x Асинхронность?»

textual
Листинг программы
         Action action = null; //это делегат "запускатора"
         Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.067 из 5
Похожие ответы