У меня есть процесс, когда обрабатывается входящий запрос пользователя в нашу систему. Я также хочу добавить некоторые метаданные о запросе в таблицу базы данных, не влияя на скорость отклика основного процесса. Для этого я добавил вызов асинхронного метода, подобного этому:
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 () никогда не выполняется.
Пересмотрен краткий вопрос, чтобы быть более кратким
В настоящее время я думаю, что веб-служба выполнила свою задачу, и поток, который называется асинхронным, больше не существует. Остановит ли это асинхронный вызов от завершения?