| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Потоки, вебсервис и возвращаемое значение |
| Автор: neiron 10.2.2009, 12:14 | ||||||||
| Сложно всё же между java и .net бегать))) вот запутался. В общем, следующая задача. Есть функция в классе:
Собственно, её нужно в виде вебсервиса представить. Всё бы ничего, но выполнение всего вызываемого занимает не менее минуты на рабочей тачке при выполнении 10ти потоков, её вызывающих. Больше потоков - больше времени (тупо из-за проца). Сервак то конечно помощнее, но всё же нагруз порядочный. Так вот, необходимо ограничить количество единовременных выполнений функции (веб-сервиса). Если есть возможность сделать подобное на уровне веб-сервиса, подскажите как. Я не нашёл. Пришёл к выводу, что нужно сверху некий пул потоков создавать с ограничением количества самих потоков. Так вот, как мне достать значение расчитаное потоком? К примеру, объявляю:
Возвращать собственно некуда, как я понимаю, если:
Можно так:
Но тогда нужно отдельно проверять окончание заданого потока. То бишь бесконечно проверять thread.IsAlive, дожидаясь ref. Кто-нибудь может предложить что-нибудь элегантное? Собирая всё воедино сверху вниз: 1. Веб-сервис получающий и возвращающий данные 2. Внутри вебсервис есть пул потоков, ограничивающий количество потоков сверху 3. Поток параметризированный 4. Поток должен вовращать данные 5. Время выполнения потока > минуты (возьмём к примеру) |
| Автор: mihryak 10.2.2009, 15:49 | ||
| в голову приходят 3 варианта, по простоте реализации расставил бы их так: 1. кол-во соединений можно, насколько понимаю, ограничить IIS'ом в web.config
2. если клиент один (что крайне странно для веб-сервисом), то можно и на стороне клиента регулировать результат выполyения потока можно выдавать эвентами из потокой функции, но .Net есть для этого стандартный механизм, построенный на IAsyncResult прокси-классы, сгенерированные wsdl, позволяют вызывать веб-методы асинхронно (почитай http://msdn.microsoft.com/en-us/library/tz4bkcx2(vs.71).aspx), так что всё уже для тебя готово к использованию 3. сама необходимость делать такими долгими веб-методы настораживает, сервер и правда жалко возможно, имеет смысл рассмотреть следующую стратегию: - клиент передаёт серверу данные для обработки, сервер их примимает и добавляет в очередь для обработки, выдавая клиенту некий Id, по которому клиент сможет получить результат - на сервере крутится некий job-processor, забирающий задачи из очереди и выполняющий их, меняя их стейт - клиент время от времени ломится на сервер со своим Id, на что сервер отвечает ему текущим статусом обработки - клиент, узнав, что задача выполнена, забирает результат (этот пункт можно совместить с предыдущим) такой механизм чем-то похож на распределённый IAsyncResult |