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

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

UDF устанавливает соединение с сервером, и этот сервер соединяется с базой данных SQL для получения данных и отправки их обратно клиенту.

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

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

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

    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.

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

Например:

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

Затем, когда поступит второй запрос (скажем, MAR 2016 следующий), эта UDF будет ожидать результата UDF от JAN 2016. Таким образом, UDF от MAR 2016 не будет устанавливать другое соединение с сервером.

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

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

2 ответа

Асинхронные вызовы не помогут вам сократить количество вызовов, просто начнут больше параллельных вызовов. Количество вызовов вызывает у вас проблемы? Может быть, вам помогут "лучшие практики": Лучшая практика C# Data Connections?

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

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

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

Другие вопросы по тегам