2016-06-07 2 views
0

Мне нужно показать несколько графиков в WindowsApplication, чтобы выбрать какой-либо параметр из пользовательского интерфейса. Скопируйте их в запрос (объект) и отправьте его в службу поддержки WCF. На основе параметра запроса мы обрабатываем и создаем ответ в формате списка и отправляем его клиенту. В полном объеме сервер занимает около 18 секунд, выполняя бизнес-логику, и после этого клиент занимает от 6 до 8 секунд, чтобы показать график в пользовательском интерфейсе для всего списка (график генерирует для каждого объекта Response). Здесь клиент должен ждать около 18 секунд, поскольку бизнес обрабатывает. Время генерации графиков клиентов можно было бы сохранить, если мы отправляем данные по частям, а не по полному списку. Поэтому моя забота заключается в том, как отправлять данные ответа по частям (граням).Как получить ответ wcf в частях

+0

Лучше всего использовать 'async/await' для вашей цели. Проверьте эту ссылку: https://msdn.microsoft.com/en-us/library/mt674882.aspx –

+0

Какая привязка wcf вы используете, каков размер среднего одиночного сообщения wcf? Преобразуйте его в байт [] и подсчитайте. Возможно, проблема заключается не в размере вашего сообщения. – ilansch

ответ

0

Это вопрос того, что делает служба WCF. Он проводит некоторое время, выполняя бизнес-логику (которая, вероятно, включает время для подключения к БД и выполнения некоторого SQL), а затем отправляет данные по проводу. Как долго это займет данные, чтобы приземлиться на клиента, это не то, на что вы можете влиять, программируя.

Однако, если бизнес-логика занимает слишком много времени, это указывает на то, что на этапе обслуживания выполняется много операций, чтобы подготовить ответ. Чтобы оптимизировать, вы можете разделить эти операции на более мелкие и разоблачить методы конечных точек для каждого из них. Затем на стороне клиента вы вызываете эти методы впоследствии и соответствующим образом обновляете свой интерфейс между вызовами. Таким образом, вы получите ответ от службы быстрее для НЕКОТОРЫХ данных.

0

Вот два варианта, которые пришли мне на ум:

  1. имеют функцию обратного вызова, что на стороне сервера будет вызывать каждый раз, когда у него есть обновления для этого запроса. Клиент запросит обработку из WCF и передаст функцию, которая будет вызываться сервером. Сервер будет вызывать эту функцию для каждой части информации.
  2. Сервер будет иметь два метода. Один из них будет «начать обработку», который начнется для вашего запроса на обработку и вернет уникальный идентификатор для этого запроса обработки. Второй метод будет заключаться в вопросе, есть ли какая-либо новая информация. Что-то вроде этого:

    var requestId = serverProxy.BeginProcessing(inputData); var response = serverProxy.InquireProgress(requestId); while(!response.Completed) { //Here you check if the response contains any new piece of information and then sleep for some time. }

Я бы предпочел второй вариант, даже если она включает в себя больше кода, потому что таким образом сервер не должен «знать» своих клиентов. На клиенте проверяется, есть ли у них какие-либо обновления. Кроме того, если вы выберете второй вариант, я также напишу небольшую оболочку SDK, которая просто выведет эти два метода сервера + логику циклов за одним методом Async.

Надеюсь, что это поможет

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