Разрешено ли использовать Task.Run в ASP. NET Базовом контроллере? - PullRequest
0 голосов
/ 18 февраля 2020

Сценарий: у меня есть веб-сервис с «Удалить» ASP. NET Действие основного контроллера. Реализация состоит из двух этапов: один дешевый, после которого другие операции уже не могут видеть удаленные данные, и длительный второй шаг, который выполняет фактическое удаление.

Можно ли использовать Task.Run для вторая операция и никогда ее не ждешь и поэтому вернешься к звонящему очень скоро? Я знаю, что эта задача может быть потеряна из-за завершения работы приложения, но разрешено ли даже перегрузить работу в фоновом режиме, используя Task.Run в ASP. NET Core, и никогда не ожидать полученную задачу?

1 Ответ

1 голос
/ 18 февраля 2020

Я знаю, что эта задача может быть потеряна из-за завершения работы приложения, но разрешается ли даже перегрузить работу в фоновом режиме с помощью Task.Run в ASP. NET Core и никогда не ждать полученной задачи?

О, конечно, ничто не помешает этому. . NET и ASP. NET позволяют использовать Task.Run, и ответ будет возвращен пользователю без задержки (при условии, что вы игнорируете задачу, возвращенную из Task.Run).

Можно ли использовать Task.Run для второй операции и никогда не ждать его, и поэтому очень скоро вернетесь к вызывающей стороне?

Вы говорите, что знаете, что задача может быть потеряна в закрытии приложения. И это правда; так что вполне возможно, что второе удаление может никогда не произойти, и не будет никакой ошибки или сообщения журнала, информирующего вас о факте. Кроме того, поскольку задача игнорируется, уведомление о ее сбое не будет отправлено, поэтому, если что-то не так с кодом удаления, никакие журналы или что-либо еще не уведомят вас о регулярных сбоях. Если вы согласны с этим, тогда используйте fire-and-Forgot.

На ASP. NET Core, вам даже не нужно Task.Run; Вы можете просто вызвать (асинхронный) метод, который выполняет вторую операцию удаления, а затем игнорировать задачу вместо await.

Будет работать просто игнорирование задач (с Task.Run или без), но это имеет отрицательный побочный эффект: ASP. NET вообще не знает о загруженной работе . Поэтому я бы порекомендовал зарегистрировать задачу и что-то отложить приложение до тех пор, пока задачи не смогут завершить . С регистрацией все еще возможно потерять задачи, но регистрация их уменьшает вероятность потери задач.

...