Асинхронный метод, кажется, не полностью выполняется - PullRequest
0 голосов
/ 18 июня 2009

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

public static ReturnObject ResponsiveMethod(string ip, string code)
{
   // ... some reasonably quick code

   IPDetail.InsertAsync(ip);  // <-- call to the async method

   return new ReturnObject(code);
}

Метод InsertAsync () выглядит следующим образом:

   public static void InsertAsync(string ipAddress)
   {
        Action action = () => IPDetail.Insert(ipAddress);
        action.BeginInvoke(aResult => Log.Debug("Completed Insert"), null);
   }

И, наконец, обычно не асинхронный метод с именем Insert ():

    private static void Insert(string ipAddress)
    {
        ApplicationContextHelper.LoadApplicationContext();
        var helper = new GeoLocationHelper();
        var result = helper.GetDetailsFromIP(ipAddress);
        Log.InfoFormat("Succesfully retreived IP data {0}.", ipAddress);
        result.Save();
    }

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

Однако у нас есть веб-сервис, который использует что-то вроде метода ResponsiveMethod (), описанного выше, и по какой-то причине асинхронные вызовы не завершаются. Все записи в методе LoadApplicationContext () запускаются, но после этого нет никаких действий в журнале, связанных с Insert (), и result.Save () никогда не выполняется.

Пересмотрен краткий вопрос, чтобы быть более кратким

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

Ответы [ 3 ]

1 голос
/ 18 июня 2009

Я никогда не использовал BeginInvoke раньше, но обычно там, где есть Begin *, вам также нужен ответ End *. Пожалуйста, добавьте его вместе с правильной обработкой исключений.

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

Вы полагаетесь на личность вызывающего в вызове метода Async? Идентификация может быть потеряна при вызове из веб-службы.

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

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

...