Я прочел себя синим, и я надеюсь, что есть простой ответ.Возврат из Контроллера, не дожидаясь завершения метода асинхронизации
У меня есть веб-API, который обрабатывает телеметрию из различных приложений «в дикой природе». В одном из моих контроллеров я хочу получить запрос на регистрацию ошибки в моей центральной базе мониторинга и как можно скорее ответить на ответ (У меня нет реального способа узнать, насколько критическая производительность может быть на конце звонящего, и уже есть значительный успех для создания первоначального запроса веб-службы).
По сути, то, что я ищу что-то вроде этого:
public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);
// ok, I've got content, now log it but don't wait
// around to see the results of the logging, just return
// an Accepted result and begone
repository.SaveSubmission(model); // <-- fire and forget, don't wait
return Accepted();
} catch (Exception)
return InternalServerError();
}
}
Похоже, что это должно быть простым, но, по-видимому, нет. Я читал любое количество сообщений, указывающих все: от yup, просто используйте Task.Run() до Это ужасная ошибка, и вы никогда не сможете достичь того, чего хотите!
Проблема в моем сценарии, по-видимому, состоит в том, что этот процесс может быть завершен в середине процесса из-за его работы на рабочем процессе ASP.NET, независимо от того, какой тип разного способа вызова методов async (I ' вы проводите последние два часа или около того, читая различные вопросы SO и блоги Стивена Клири ... whew).
Если основной вопрос в этом случае заключается в том, что метод, который я бы «запустил и забыл», привязан к контексту http и подвержен раннему завершению рабочим процессом ASP.NET, тогда мой вопрос будет ...
Есть ли способ удалить этот метод/задачу/процесс из этого контекста ASP.NET? После того как этот запрос анализируется в модели, я сам не нуждаюсь в более конкретной необходимости работать в контексте http. Если есть простой способ, я могу вытащить его оттуда (и, таким образом, позволить запущенному веществу запустить перезапуск веб-сайта/пула приложений), это было бы здорово.
Ради должной осмотрительности, скажем, избавиться от хранилища контекста в контроллере и передать его в какой-то другой контекст:
public IHttpActionResult Submit() {
try {
var model = MyModel.Parse(Request.Content.ReadAsStringAsync().Result);
SomeStaticClass.SaveSubmission(model); // <-- fire and forget, don't wait
return Accepted();
} catch (Exception)
return InternalServerError();
}
}
... то единственное, что имеет значение «крест линии "- сама модель - никаких других зависимостей логики кода.
Предоставлено, я, вероятно, делаю гору мухи - вставка в базу данных не займет всего лишь часть времени в любом случае ... похоже, что это должно быть легко, хотя, и я, видимо, тоже упрямый, чтобы согласиться на «достаточно хорошо» сегодня вечером.
Спасибо за ответ. Я знаю, что запись db невелика, но вначале я подумал «почему бы нет», не понимая последствий. Я отказался от этой идеи. Я столкнулся с HangFire в своих путешествиях, исследуя это и, безусловно, помню, когда возникает настоящая необходимость. – jleach