Я переключается на Task.Run на Hangfire. В .NET 4.5+ Task.Run
может возвращаться Task<TResult>
, что позволяет мне запускать задачи, которые возвращаются за исключением void
. Я могу нормально подождать и получить результат моей задачи путем доступа к свойству MyReturnedTask.Result
Работа в фоновом режиме с возвращаемым значением
Примера моего старого кода:
public void MyMainCode()
{
List<string> listStr = new List<string>();
listStr.Add("Bob");
listStr.Add("Kate");
listStr.Add("Yaz");
List<Task<string>> listTasks = new List<Task<string>>();
foreach(string str in listStr)
{
Task<string> returnedTask = Task.Run(() => GetMyString(str));
listTasks.Add(returnedTask);
}
foreach(Task<string> task in listTasks)
{
// using task.Result will cause the code to wait for the task if not yet finished.
// Alternatively, you can use Task.WaitAll(listTasks.ToArray()) to wait for all tasks in the list to finish.
MyTextBox.Text += task.Result + Environment.NewLine;
}
}
private string GetMyString(string str)
{
// long execution in order to calculate the returned string
return str + "_finished";
}
Насколько я могу видеть из Quick Start страницы замедленного воспламенения, ваш главный парня, который BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
отлично выполняет код как фоновое задание, но, по-видимому, не поддерживает задания, которые имеют возвращаемое значение (например, код, представленный выше). Это правильно? если нет, как я могу настроить мой код, чтобы использовать Hangfire?
P.S. Я уже смотрел на HostingEnvironment.QueueBackgroundWorkItem
(here), но по-видимому, не имеет такую же функциональность (фоновые задания должны быть void
)
EDIT
Как @Dejan выяснил, главная причина, я хочу, чтобы переключиться на замедленное воспламенение является по той же причине пользователи .NET добавили QueueBackgroundWorkItem
в .NET 4.5.2. И эта причина хорошо охарактеризована в замечательном article Скотта Хансельмана о Фоновых Задачах в ASP.NET. Так что я собираюсь цитата из статьи:
QBWI (QueueBackgroundWorkItem) графики задачу, которая может работать в фоновом режиме, независимо от любого запроса. Это отличается от обычного рабочего элемента ThreadPool тем, что ASP.NET автоматически отслеживает, сколько рабочих элементов зарегистрировано через этот API в настоящее время запущено, а время выполнения ASP.NET будет попытаться отложить закрытие AppDomain до завершения этих рабочих элементов выполнение.
Возвращаемое значение методов отображается на странице информации о задании на панели управления. Если вы посмотрите в соответствующей таблице db для заданий Hangfire, возвращаемое значение должно быть сохранено в поле. См. Https://github.com/HangfireIO/Hangfire/pull/161 - кроме этого я не знаю, доступно ли ему доступ к нему программно – adaam
Спасибо, что указали это. – yazanpro
У меня точно такой же вопрос. Вы что-то задумали? – Dejan