.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);