Упаковка нескольких запросов для уменьшения количества подключений к серверу

Я пишу надстройку Excel, используя ExcelDNA, и создаю UDF (определяемую пользователем функцию).

Пользовательская функция устанавливает соединение с сервером, а этот сервер подключается к базе данных SQL, чтобы получить данные и отправить их обратно клиенту.

Однако ожидается, что эта определяемая пользователем функция будет вызываться сотни раз на одном листе.

Я пытаюсь найти способ уменьшить количество запросов к серверу.

На данный момент шаблон выглядит так (упрощенно):

    ITEM     | JAN 2016 | FEB 2016 | MAR 2016 |
---------------------------------------------------
   ITEM 1    |    UDF   |    UDF   |   UDF    |
   ITEM 2    |    UDF   |    UDF   |   UDF    |
   ITEM 3    |    UDF   |    UDF   |   UDF    |
   ITEM 4    |    UDF   |    UDF   |   UDF    |
   ITEM 5    |    UDF   |    UDF   |   UDF    |
   ITEM 6    |    UDF   |    UDF   |   UDF    |

Итак, прямо сейчас это отправит в общей сложности 18 запросов.

Я хотел бы попытаться уменьшить количество запросов до 6.

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

Например:

Для ПУНКТА 1: если UDF в столбце JAN 2016 вызывается первым, он запросит данные за все месяцы ПУНКТА 1, а затем сохранит эти данные где-нибудь для других запросов.

Затем, когда приходит 2-й запрос (скажем, следующий МАР 2016 г.), эта UDF будет ждать результата UDF от ЯНВАРЯ 2016 г. Таким образом, UDF МАР 2016 г. не нужно будет запускать другое соединение с сервером.

Однако я понятия не имею, как это реализовать. Я слышал о ключевых словах await и async, но не имел опыта их использования.

Любые другие варианты решения проблемы также приветствуются.


person Steven John Lally    schedule 26.08.2016    source источник
comment
Рассмотрите возможность удаления тега async-await, поскольку он не имеет отношения к пакетной обработке и, в частности, к вашему вопросу.   -  person cassandrad    schedule 26.08.2016


Ответы (2)


Асинхронные вызовы не помогут вам сократить количество вызовов, они просто запустят больше параллельных вызовов. Количество звонков не вызывает у вас проблем? Возможно, вам помогут приведенные здесь «лучшие практики»: Рекомендации по подключению данных C#?

person Mr. T    schedule 26.08.2016

Вам могут помочь асинхронные функции и пакетная обработка. По сути, вы собираете все запросы, которые вы хотите сделать, на серверную часть в течение короткого периода времени (скажем, полсекунды), а затем запускаете один вызов на серверную часть. Когда результат возвращается, вы завершаете асинхронный вызов для каждого запроса.

Этот Gist имеет полную реализацию асинхронной и пакетной частей, вам просто нужно указать функцию пакетной оценки: https://gist.github.com/govert/1bf0a1026ec3aaee19a8

Группа Excel-DNA Google, вероятно, лучше подходит для любых дополнительных вопросов об этом примере.

person Govert    schedule 26.08.2016