0

Я создаю приложение Windows (используя приложение формы Windows), которое вызывает веб-службу для извлечения данных. В данных мне нужно получить информацию о 200+ клиентах и ​​для каждого клиента, я должен получить всю информацию о пользователях. Клиент может иметь от 50 до 100 пользователей. Таким образом, я вызываю веб-службу в цикле (после получения списка всех клиентов) для каждого клиента, чтобы получить список пользователей. Это долгий процесс. Я хочу сократить время выполнения всего этого процесса. Поэтому, пожалуйста, предложите мне, какой подход может помочь в сокращении времени выполнения, которое в настоящее время составляет до 40-50 минут для однократной выборки данных. Дайте мне знать любое решение, такое как многопоточность или что-то еще, в зависимости от того, что лучше всего подходит для моего приложения.Как сократить время выполнения на C# при вызове API?

Заранее спасибо.

ответ

2

Я предлагаю вам избегать вызова службы в цикле для каждого пользователя, чтобы получить данные, но вместо этого сделать этот цикл на сервере и вернуть все данные в один выстрел, иначе вы будете страдать от много бесполезных задержки, вызванные тысячами вызовов, а не только из-за времени сервера или времени передачи данных.

Это также узор, называемый Remote Facade или Facade Pattern объяснил Мартин Фаулер и Банды Четыре:

любого объект, который предназначен для использования в качестве удаленных объектов необходим крупнозернистого интерфейс, который минимизирует количество звонков, необходимых для того, чтобы что-то сделать [...] Вместо того, чтобы запрашивать заказ и его строки заказа индивидуально, вам необходимо получить доступ и обновить строки заказа и заказа за один раз.

+0

Привет Майкл, Спасибо за Ваш ответ. Я не контролирую веб-сервис, поэтому не могу вносить изменения в веб-службу. Таким образом, это не будет работать для этого случая. – atul

3

Если вы контролируете веб-службу, у вас есть метод, который возвращает всех клиентов одновременно, а не один на один, чтобы избежать роутинга, как предложил Майкл.

Если нет, убедитесь, что вы сделали столько запросов одновременно (не в последовательности), чтобы избежать как можно большего количества времени. Для каждого запроса у вас будет по крайней мере 1 роутеррип (так, по крайней мере, задержка вашего пинга за задержку), если вы сделаете 150 запросов, вы получите свой пинг на сервер X 150 Worth «всего лишь ожидания в сети». Если вы разделите эти запросы на 4 пучка и выполните каждую из этих пучков параллельно, вы будете ждать только 150/4 * пинга. Таким образом, чем больше запросов вы выполняете одновременно, тем меньше вы ожидаете.

+0

Hi Ronan, Спасибо за ваш ответ. Итак, я должен реализовать многопоточность и должен начать новый поток для каждого 4-го клиента для получения данных пользователей. Правильно? – atul

+0

@atul Нет, начало потока происходит очень медленно, вам нужно прочитать многопоточность, это сложный способ, чтобы вписаться в ответ stackoverflow, забрать книгу на нем. Но суть в этом состоит в том, что вам необходимо заранее выделить достаточные потоки (как правило, вокруг количества виртуальных ядер, включая HT, X2 - хороший компромисс для многих рабочих нагрузок) и сохранить как можно больше из тех, которые используются (так что каждый запрос получает выделение первый неиспользуемый поток). –

+0

@atul Также обратите внимание на то, что это было непонятно, если вы можете получить первый вариант (получение веб-службы для предоставления полного списка сразу), это всегда будет МАССИВНО быстрее.Поэтому я сначала спустился по этой дороге (даже если бы я не контролировал эту услугу, я бы попросил изменения для тех, кто ее предоставляет, вероятность того, что они будут удовлетворены, потому что иначе вы будете забивать свои серверы с сотнями просьб, а не хорошо, один!) –

0

Если вы не контролируете веб-службу, вы можете попробовать использовать цикл Parallel.ForEach вместо цикла ForEach для запроса веб-службы.

MSDN от есть учебник о том, как использовать его: http://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx

+0

Hi Guillaume, Спасибо за ваш ответ. Я проверю и реализую это. – atul

+0

@atul Хорошо. Дайте мне знать, исправляет ли это вашу проблему. –

Смежные вопросы