我正在从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";
}
据我从 Hangfire 的快速启动页面所见,您的主要人员BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));
完美地将代码作为后台作业运行,但显然不支持具有返回值的作业(如我上面提供的代码)。那正确吗?如果没有,我该如何调整我的代码以使用 Hangfire?
PS 我已经看过HostingEnvironment.QueueBackgroundWorkItem
(这里),但它显然缺乏相同的功能(必须有后台工作void
)
编辑
正如@Dejan 发现的那样,我想切换到 Hangfire 的主要原因与 .NETQueueBackgroundWorkItem
人员在 .NET 4.5.2 中添加的原因相同。Scott Hanselman关于 ASP.NET 中的后台任务的精彩文章很好地描述了这个原因。所以我要引用这篇文章:
QBWI (QueueBackgroundWorkItem) 调度一个可以在后台运行的任务,独立于任何请求。这与普通的 ThreadPool 工作项不同,因为 ASP.NET 自动跟踪通过此 API 注册的工作项当前正在运行,并且 ASP.NET 运行时将尝试延迟 AppDomain 关闭,直到这些工作项完成执行。