WCF и длительные вычисления
От: d8m1k Россия  
Дата: 16.09.13 20:30
Оценка: 1 (1) :)
Здравствуйте! Есть проблема, которую не могу решить.

Допустим сервер выполняет некие длительные вычисления. Выполняет их в фоновых потоках. В 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 адекватно?
wcf многопоточность
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.