Долгосрочная задача в WebAPI

Здесь моя проблема: мне нужно вызвать несколько сторонних методов внутри ApiController. Подпись для этих методов - Task DoSomethingAsync(SomeClass someData, SomeOtherClass moreData). Я хочу, чтобы эти вызовы продолжали работать в фоновом режиме, после того, как ApiController отправил данные обратно клиенту. Когда DoSomethingAsync завершается, я хочу сделать некоторые записи и, возможно, сохранить некоторые данные в файловой системе. Как я могу это сделать? Я бы предпочел использовать синтаксис asyny/wait.

Ответ 1

Стивен описал, почему запуск по-настоящему долговременных задач "огонь-и-забыть" внутри ApiController - плохая идея.

Возможно, вам нужно создать отдельную службу для выполнения этих задач "огонь и забвение". Эта служба может быть другим ApiController, рабочим за очередью, всем, что может быть организовано самостоятельно и иметь независимое время жизни.

Это упростит управление различными сроками выполнения задач и отделит проблемы долгосрочных задач от основных обязанностей ApiController.

Ответ 2

Ты почти никогда не хочешь этого делать. Это почти всегда большая ошибка.

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

Тем не менее, если вы абсолютно уверены, что хотите реализовать этот чрезвычайно опасный дизайн, вы можете использовать BackgroundTaskManager из моего блога.

Ответ 3

Отличные новости. В .NET 4.5.2 есть новое решение, называемое API QueueBackgroundWorkItem. Это очень просто использовать:

HostingEnvironment.QueueBackgroundWorkItem(ct => DoSomething(a, b, c));

Здесь подробно описывается статья.

https://blogs.msdn.microsoft.com/webdev/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-background-processes-in-asp-net/

И вот статья, в которой упоминается несколько других подходов, не упомянутых в этой теме. http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx