У меня есть Azure Функция, в которой асинхронный метод async Task<IActionResult> MethodA
вызывает async Task MethodB
. Поскольку ожидается, что MethodB
всегда будет длиться более 1 минуты, мы должны начать MethodB
и вернуть 202 Принимается в MethodA
до окончания MethodB
. Внутри MethodB
мы отслеживаем статус, сохраняя информацию в таблице. Если MethodB
завершается неудачей или выдает исключение, мы ловим исключение и соответствующим образом обновляем таблицу. Таким образом, когда клиент запрашивает состояние задачи, он выбирает результат из таблицы. Вот псевдокод того, что происходит на самом деле:
// The starting method.
[FunctionName("MethodA")]
public static async Task<IActionResult> MethodA(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "start")] HttpRequest request,
ILogger logger)
{
// Somehow start MethodB so that it runs and we can return 202 Accepted before it finishes.
return new AcceptedResult();
}
private static async Task MethodB(ILogger logger)
{
try
{
// Insert row into table with status "running" and do logging.
// Do stuff that takes longer than 1 minute and do more logging.
}
catch(Exception exception) // Very general exception handling for pseudo-code.
{
// Update row in table to status "failed" an do some logging.
}
}
[FunctionName("MethodC")
public static async Task<IActionResult> MethodC(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "get")] HttpRequest request,
ILogger logger)
{
// Looks for row in table, gets the status, and do logging.
// Returns 200 Ok if still running or succeeded, otherwise otherwise some failure code.
// Also returns the exact status in the table to differentiate between running and succeeded.
}
Какие есть варианты для запуска MethodB
, чтобы он продолжал работать после того, как я верну 202 Принято? Я видел много вещей о разных решениях, некоторые из которых блокируют потоки, а некоторые нет, поэтому меня это немного смущает, так как я новичок в этом.