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

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

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

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

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

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

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


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

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

15   голосов , оценка 4.067 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы