sai sruthi Ответов: 1

Как вызвать асинхронный метод в hangfire с помощью C#


Привет,
У меня есть требование выполнить некоторую трудоемкую операцию(создать html-шаблон на основе запроса) в Web Api и преобразовать его в pdf-файл и отправить в виде вложения по почте.Это должно происходить в фоновом режиме.
Проблема в том, что у меня есть обработчик запросов, который является асинхронным методом, и этот метод используется для создания нескольких шаблонов и занимает очень много времени, и мы не хотим, чтобы пользователь ждал, пока мы завершим эту операцию. Поэтому мы решили использовать HangFire.
Но проблема здесь в том, что задание не выполняется, и на большинстве форумов они упоминали, что с помощью HangFire можно выполнять только синхронные вызовы.

Поэтому я хотел бы знать, можно ли вызвать асинхронный метод синхронно, так что я буду вызывать этот синхронный метод внутри backgroundJob.Enqueue().Если да, то не могли бы вы помочь мне с каким-нибудь примером.
Примечание: Я выполняю дальнейшие операции, основанные на результате этого асинхронного метода

Что я уже пробовал:

Я попробовал вызвать метод асинхронный метод синхронно используя
Task.Run(()=>AsyncMethod()).Result
и тоже попробовал
Task.Run(async()=>await AsyncMethod()).Result, Task.Run(()=>AsyncMethod()).ConfigureAwait(false).GetAwaiter().GetResult()
любить,

public void HangFireMethodCall(){
BackgroundJob.Enqueue(()=>SyncMethod());
}

public SomeReturnType SyncMethod(){
Task.Run(async()=>await AsyncMethod(Request)).Result;
return successMessage;
}

public async Task<returntype> AsyncMethod(RequestType request){
var response= await ExecuteAsync(request);
//Based on response do some operation
}
Но ничто не выполняло асинхронный метод.

несколько реферальных ссылок, которые я пробовал, это,
Асинхронные задания задач - вопрос - Обсуждение Hangfire[^]
async await - как вызвать асинхронный метод из синхронного метода в C#? - переполнение стека[^]

1 Ответов

Рейтинг:
1

MadMyche

Обе ваши ссылки имеют возраст несколько лет; Hangfire действительно добавил некоторые из них квази-синхронные методы с выходом версии 1.6:
Hangfire 1.6.0[^]

Однако обратите внимание на этот абзац:

Запись В Блоге Hangfire 1.6.0:
Это не настоящая асинхронность
Пожалуйста, рассматривайте эту функцию как синтаксический сахар. Фоновая обработка не стала асинхронной. Внутренне он был реализован с помощью задачи.Метод ожидания, поэтому рабочие не выполняют никакой обработки, ожидая завершения задачи. Реальная асинхронность может появиться в Hangfire 2.0 только, и это требует много критических изменений в существующих типах.
А еще есть такая запись so (которая привела меня к вышесказанному)
c# - Как вызвать асинхронные методы в Hangfire? - переполнение стека[^]