Здравствуйте! Есть проблема, которую не могу решить.
Допустим сервер выполняет некие длительные вычисления. Выполняет их в фоновых потоках. В WCF я предусмотрел функции запуска этих длительных процессов, а так же функции опроса текущего состояния о проделанной работе.
Создаю фоновые потоки так, по-современному, в задачах
for (int i = 1; i<=Q; ++i) {
Task.Factory.StartNew(() => {
doWork(n);
});
}
или так, по старенькому, прямо в виде потоков
for (int i = 1; i<=Q; ++i) {
new Thread(() => {
doWork(n);
}).Start();
}
Так вот оказывается функция опроса текущего состояния в WCF норовит дождаться выполнения этих потоков, если вычислений производится много. В случае с WinForm приложением всё отлично, фоновых процессов создаю сколько угодно, однако графический интерфейс не замерзает, кнопка "получить состояние" доступна. У UI потока хороший приоритет. В случае с WCF получается как будто поток из которого происходит опрос состояния имеет такой же приоритет как и фоновые потоки, и в случае запуска фоновой работы через задачи опрос состояния начинает хоть как-то срабатывать только когда фоновых задач становиться не больше чем ядер у процессора.
И тут не в блокировках дело. Так как например функция
public int GetNum() {
return 42;
}
тоже тупит в WCF в случае большой нагрузки.
Сервис создаю с атрибутами:
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple, UseSynchronizationContext=true)]
пробовал перебирать флаги TaskCreationOptions в 1-ом случае и Thread.CurrentThread.Priority во втором, эффекта не заметил. Тут что то требуется концептуальное.
Тестовое
приложение написал. Там цифры ежесекундно считываются с WCF. И ежесекундно считывается с WCF картинка с графиком выполнения процессов. После нажатия кнопки "Пуск" запускается указанное количество процессов, в каждом из которых эмулируется нагрузка + рисуются вертикальные палки на графике в строчках соответствующей заданиям. Видно что интерфейс замораживается, даже перестают считываться цифры, пока фоновая работа не выполнится. В случае данного одноядерного хостинга, замораживается полностью.
Может кто намекнёт, где покопать, чтоб можно было реализовать фоновую обработку в WCF адекватно?