Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
138 / 138 / 53
Регистрация: 14.06.2016
Сообщений: 467
1
.NET 4.x

Асинхронность?

17.08.2017, 23:10. Показов 562. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Уже как то создавал подобную тему, но моя текущая реализация меня не устраивает чуть более чем полностью, создам новую.
Есть у меня некая сущность клиента. В каждом клиенте, на протяжении всей его жизни есть штук 10-15 фоновых сервисов.
сервисы запускаются так
C#
1
2
3
4
5
6
7
8
9
10
11
12
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) или типа
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    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 как я понял не подойдет, поскольку пока поток находится в состоянии сна, он считается занятым.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.08.2017, 23:10
Ответы с готовыми решениями:

Потоки. Асинхронность
Уважаемые специалисты, помогите пожалуйста с определениями, прошу не давать ссылки на msdn, потому...

Асинхронность в VS2010
Возможно ли использование асинхронности в VS2010, async &amp; wait В одной статье написано что...

Асинхронность без многопоточности
Несколько дней рою в эту тему. Уяснил что для исполнения асинхронного кода многопоточность не...

Linq to Entities. Вернуть асинхронность
Всем привет. Изначально нужна была просто выборка из базы. Но потом пришлось отформатировать дату ,...

1
263 / 224 / 108
Регистрация: 09.12.2015
Сообщений: 652
18.08.2017, 00:00 2
Я бы сделал так:
не запускал был сразу все сервисы, как кучу долгоживущих задач, а запустил бы во вторичном потоке всего одну
долгоживущую задачу, которая в цикле будет опрашивать каждый сервис на предмет необходимости выполнить что-что.
И когда такая необходимость появляется - то запускать сервис, как новую задачу.
Получается, что во вторичном потоке всегда живёт сканер и "запускатор" сервисов, который запускает требуемые сервисы, как отдельные задачи только по необходимости.

Когда "запускатор" запустит сервис, тот возьмёт свободный поток из пула потоков, отработает, и вернёт его обратно.

Добавлено через 23 минуты
Причём сам "запускатор" запустить с такой опцией:
C#
1
2
         Action action = null; //это делегат "запускатора"
         Task.Factory.StartNew(action, TaskCreationOptions.LongRunning);
0
18.08.2017, 00:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.08.2017, 00:00
Помогаю со студенческими работами здесь

Как правильно понять асинхронность?
В моем большом приложении наступил момент, что нужно сделать долгие операции такими, чтобы они в...

Ещё раз про асинхронность
Скажите пожалуйста, зачем в данном случае использовать асинхронность, когда и синхронное выполнение...

Callback с сайта, асинхронность и прочее
Привет. Разрабатываю бота для телеграмма. Бот будет стоять на VDS под управлением Windows Server...

Для чего в этой программе асинхронность?
Здравствуйте ! Подскажите пожалуйста, для чего в этой программе асинхронность ? ( Программа...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru