Нужна помощь с асинхронной операцией - PullRequest
1 голос
/ 20 апреля 2009

Я относительно новичок в асинхронном и сервис-ориентированном программировании и хочу сделать следующее:

  1. Запустить хранимую процедуру в базе данных, которая может выполняться в течение нескольких минут или даже часов.
  2. Возвращает вызывающему абоненту код идентификатора задания, который клиент может использовать для отслеживания хода выполнения задания.

Это кажется простой задачей, но, будучи новичком в асинхронном кодировании, я обеспокоен неизвестными подводными камнями. Есть ли четко определенный шаблон для этого типа функциональности? Если да, есть ли у него имя и что такое хороший ресурс?

Ответы [ 5 ]

0 голосов
/ 29 декабря 2011

Этот ответ приходит спустя более 2 лет после того, как я задал оригинальный вопрос, но я не нашел то, что искал конкретно, до недавнего времени, когда натолкнулся на книгу «Шаблоны проектирования служб».

Шаблон подтверждения запроса

http://servicedesignpatterns.com/ClientServiceInteractions/RequestAcknowledge

Клиент хотел бы манипулировать файлом или документом, запустить бизнес-задачу или уведомить систему об интересном событии. Запросы не нужно обрабатывать сразу. Если требуется ответ, его не нужно доставлять, как только запрос обработан.

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

enter image description here

0 голосов
/ 26 ноября 2009

В вашем случае вам нужно использовать метод обратного вызова. Это отключит выполнение sql SP, и ваш код будет уведомлен, когда выполнение завершится. Кроме того, вы можете использовать объект AsynResult для опроса, была ли операция завершена или нет.

См. Ссылку SqlCommand .. ::. BeginExecuteReader Method (AsyncCallback, Object) для метода обратного вызова.

Если вам тоже нужно опросить, вы можете опросить по IAsyncResult:

// Make the asynchronous call
IAsyncResult result = command.BeginExecuteReader(callback, command);

// Poll to see if complete
while (!result.IsCompleted)
{    
// Do more work here if the call isn't complete    
Thread.Sleep(100);
}

См. Мой ответ по Что такое AsyncCallback? для всех различных типов асинхронных методов, объясненных простым способом.

0 голосов
/ 11 июня 2009

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

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

Для практического примера (.NET) асинхронного вызова хранимой процедуры (который, кажется, имеет отношение к вашему конкретному случаю) посмотрите здесь .

0 голосов
/ 11 июня 2009

Если вы хотите сделать это асинхронно, у вас есть 2 основных способа:

Зарегистрируйте функцию обратного вызова с любым ресурсом, который вы используете, который будет вызываться по завершении.

или

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

0 голосов
/ 20 апреля 2009

Проверьте шаблон наблюдателя .

Из википедии:

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

Другая хорошая статья в MSDN о шаблоне наблюдателя может быть найдена здесь

...