Какова лучшая модель потоков для доступа к базе данных в клиенте Windows Forms? - PullRequest
0 голосов
/ 04 ноября 2010

Это довольно стандартная установка, клиент WinForms> Самообслуживаемый уровень Business / Data> SQL Server (хранимые процедуры).

На данный момент мой вызов WinForms для получения данных будет выглядеть примерно так:
MyData = RecipientInfo.GetListings(<options>). Затем он заполнит пользовательский интерфейс указанными данными, в основном через Binding, поскольку все объекты поддерживают такие вещи, как BindingList и INotifyPropertyChanged.

Функция GetListings() делает две вещи. Сначала он получает список данных для поиска, затем, как только эта структура будет заполнена из DataReader, другая функция отключится и сделает больше доступа к базе данных, вызвав метод статических GetOtherRelatedStuff(<stuffId>) других объектов. Затем он будет отсортирован и сгруппирован позже.

Я полагаю, что мой вопрос на самом деле больше относится к вкусу, но вот очевидные варианты, если я хочу обработать свой SQL (DataReaders и т.п., чтобы заполнить мои объекты вручную), а затем выполнить некоторый базовый анализ данных, пока пользователь ждет.

  1. Сделайте так, чтобы мой начальный механизм доступа к данным использовал шаблон IAsyncResult, моя WinForm будет ожидать обратного вызова
  2. Используйте функцию SqlCommands BeginExecuteReader() и обратный вызов, когда будете готовы. Это не поможет моему вызывающему коду, поэтому мне придется подключить процедуру двойного обратного вызова, чтобы сообщить клиенту WinForms о завершении работы
  3. События? Вероятно, нет.
  4. BackgroundWorker? Это хорошо, и я использовал это с большим успехом и раньше, но он действительно немного ориентирован на пользовательский интерфейс (что действительно является смыслом этого упражнения).
  5. Использовать задачи из расширений Parallel в моем коде вызова WinForms. Я предполагаю, что мой реальный код уровня данных для работы с SQL будет написан синхронно, как обычно, и WinForm просто позаботится о его запуске и обработке пользовательского интерфейса после его завершения.

Фактически, я также могу использовать внутренние помощники, такие как AsParallel, чтобы помочь с дополнительными методами получения данных и группированием / сортировкой данных после завершения работы SQL.

Задачи также значительно упрощают модульное тестирование, поскольку мой код доступа к данным написан так, что его легко выполнить.

Что-нибудь, что я пропустил?

1 Ответ

0 голосов
/ 22 ноября 2010

Хорошо, так что это был довольно субъективный вопрос, но я решил пойти по пути Задач из TPL, выполняемых из моего клиента WinForms.

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

SQL выполняется синхронно, но через Задачи он самопоточный.Хотя мне нужно тщательно продумать код WinForms, чтобы он соответствовал конкретным требованиям к данным, он легко разбивается и прекрасно связывает решение.

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