Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Потоки, вебсервис и возвращаемое значение 
:(
    Опции темы
neiron
  Дата 10.2.2009, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 18.4.2006
Где: Краснодар

Репутация: нет
Всего: 4



Сложно всё же между 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. Время выполнения потока > минуты (возьмём к примеру)
PM MAIL   Вверх
mihryak
Дата 10.2.2009, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 19
Всего: 36



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

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


2. если клиент один (что крайне странно для веб-сервисом), то можно и на стороне клиента регулировать
результат выполyения потока можно выдавать эвентами из потокой функции, но .Net есть для этого стандартный механизм, построенный на IAsyncResult
прокси-классы, сгенерированные wsdl, позволяют вызывать веб-методы асинхронно (почитай это), так что всё уже для тебя готово к использованию

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

Это сообщение отредактировал(а) mihryak - 10.2.2009, 15:56
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.