Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Потоки, вебсервис и возвращаемое значение


Автор: neiron 10.2.2009, 12:14
Сложно всё же между java и .net бегать))) вот запутался. 

В общем, следующая задача. 

Есть функция в классе:

Код

public List<PathPoint> Process(List<PathPoint> pathPoints){
            
            
            GlobalNetwork gn = new GlobalNetwork();
            networkDataset = gn._NetworkDataset;

            return Solving(pathPoints);

        }


Собственно, её нужно в виде вебсервиса представить. Всё бы ничего, но выполнение всего вызываемого занимает не менее минуты на рабочей тачке при выполнении 10ти потоков, её вызывающих. Больше потоков - больше времени (тупо из-за проца). Сервак то конечно помощнее, но всё же нагруз порядочный. 
Так вот, необходимо ограничить количество единовременных выполнений функции (веб-сервиса). Если есть возможность сделать подобное на уровне веб-сервиса, подскажите как. Я не нашёл. 

Пришёл к выводу, что нужно сверху некий пул потоков создавать с ограничением количества самих потоков. Так вот, как мне достать значение расчитаное потоком?
К примеру, объявляю:

Код

Thread thread = new Thread(new ParameterizedThreadStart(ober.Process));
thread.Start(pointList);


Возвращать собственно некуда, как я понимаю, если:
Код

public List<PathPoint> Process(List<PathPoint> pathPoints){


Можно так:
Код

public void Process(List<PathPoint> pathPoints, ref List<PathPoint> returnPoints){

Но тогда нужно отдельно проверять окончание заданого потока. То бишь бесконечно проверять thread.IsAlive, дожидаясь ref.

Кто-нибудь может предложить что-нибудь элегантное?
Собирая всё воедино сверху вниз:
1. Веб-сервис получающий и возвращающий данные
2. Внутри вебсервис есть пул потоков, ограничивающий количество потоков сверху
3. Поток параметризированный
4. Поток должен вовращать данные
5. Время выполнения потока > минуты (возьмём к примеру)

Автор: mihryak 10.2.2009, 15:49
в голову приходят 3 варианта, по простоте реализации расставил бы их так:
1. кол-во соединений можно, насколько понимаю, ограничить IIS'ом в web.config
Код

 <system.net>
    <connectionManagement>
      <add address="*" maxconnection="20"/>
    </connectionManagement>
  </system.net> 


2. если клиент один (что крайне странно для веб-сервисом), то можно и на стороне клиента регулировать
результат выполyения потока можно выдавать эвентами из потокой функции, но .Net есть для этого стандартный механизм, построенный на IAsyncResult
прокси-классы, сгенерированные wsdl, позволяют вызывать веб-методы асинхронно (почитай http://msdn.microsoft.com/en-us/library/tz4bkcx2(vs.71).aspx), так что всё уже для тебя готово к использованию

3. сама необходимость делать такими долгими веб-методы настораживает, сервер и правда жалко
возможно, имеет смысл рассмотреть следующую стратегию: 
- клиент передаёт серверу данные для обработки, сервер их примимает и добавляет в очередь для обработки, выдавая клиенту некий Id, по которому клиент сможет получить результат
- на сервере крутится некий job-processor, забирающий задачи из очереди и выполняющий их, меняя их стейт
- клиент время от времени ломится на сервер со своим Id, на что сервер отвечает ему текущим статусом обработки
- клиент, узнав, что задача выполнена, забирает результат (этот пункт можно совместить с предыдущим)
такой механизм чем-то похож на распределённый IAsyncResult

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)