Я использую асинхронные операции в моем клиенте WinForms с самого начала, но только для некоторых операций. Когда ExecuteReader
или ExecuteNonQuery
завершается, делегат обратного вызова срабатывает, и все работает просто отлично.
У меня два вопроса:
1) Какова лучшая структура для решения этой проблемы в реальной системе? Все примеры, которые я видел, являются игрушечными примерами, когда форма обрабатывает завершение операции и затем открывает устройство чтения данных на EndExecuteReader
. Конечно, это означает, что форма более тесно связана с базой данных, чем обычно. И, конечно же, форма всегда может легко вызвать .Invoke
на себя. Я настроил все мои асинхронные объекты для наследования от класса AsyncCtrlBlock<T>
и имею форму и все делегаты обратного вызова, предоставленные конструктору асинхронных объектов в моем DAL.
2) Я собираюсь повторно посетить часть программы, которая в настоящее время не является асинхронной. Он делает два звонка подряд. Когда первый завершен, часть модели может быть заполнена. Когда вторая завершена, оставшаяся часть модели может быть завершена - но только если первая часть уже сделана. Каков наилучший способ структурировать это? Было бы замечательно, если бы первое чтение могло быть выполнено, и обработка, связанная с первым чтением, продолжалась, пока запущено второе, но я не хочу, чтобы обработка второго чтения начиналась, пока я не узнаю, что обработка данные первого чтения завершены.