带返回值的 Hangfire 后台作业

2024-01-01

我要从Task.Run https://msdn.microsoft.com/en-us/library/hh195051%28v=vs.110%29.aspx to Hangfire http://docs.hangfire.io/en/latest/quick-start.html。在 .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";
}

据我所知快速开始 http://docs.hangfire.io/en/latest/quick-start.htmlHangfire 的页面,你的主要人物是BackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget"));完美地将代码作为后台作业运行,但显然不支持具有返回值的作业(如我上面提供的代码)。是对的吗?如果没有,我该如何调整我的代码才能使用 Hangfire?

附:我已经看过了HostingEnvironment.QueueBackgroundWorkItem (here http://blogs.msdn.com/b/webdev/archive/2014/06/04/queuebackgroundworkitem-to-reliably-schedule-and-run-long-background-process-in-asp-net.aspx)但它显然缺乏相同的功能(后台作业必须是void)

EDIT

正如@Dejan 所指出的,我想切换到 Hangfire 的主要原因与 .NET 人员添加的原因相同QueueBackgroundWorkItem在 .NET 4.5.2 中。斯科特·汉塞尔曼 (Scott Hanselman) 的伟大著作中很好地描述了这个原因article http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx关于 ASP.NET 中的后台任务。所以我要引用这篇文章:

QBWI(QueueBackgroundWorkItem)调度一个可以在后台运行的任务,独立于 任何请求。这与普通 ThreadPool 工作项的不同之处在于 ASP.NET 自动跟踪注册的工作项数量 通过此 API 当前正在运行,并且 ASP.NET 运行时将 尝试延迟 AppDomain 关闭,直到这些工作项完成 执行。


一种简单的解决方案是轮询监控 API,直到作业完成,如下所示:

    public static Task Enqueue(Expression<Action> methodCall)
    {
        string jobId = BackgroundJob.Enqueue(methodCall);
        Task checkJobState = Task.Factory.StartNew(() =>
        {
            while (true)
            {
                IMonitoringApi monitoringApi = JobStorage.Current.GetMonitoringApi();
                JobDetailsDto jobDetails = monitoringApi.JobDetails(jobId);
                string currentState = jobDetails.History[0].StateName;
                if (currentState != "Enqueued" && currentState != "Processing")
                {
                    break;
                }
                Thread.Sleep(100); // adjust to a coarse enough value for your scenario
            }
        });
        return checkJobState;
    }

注意力:当然,在 Web 托管的场景中,您不能依赖任务的继续(task.ContinueWith())在作业完成后执行更多操作,因为 AppDomain 可能会关闭 - 出于同样的原因,您可能首先想要使用 Hangfire。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带返回值的 Hangfire 后台作业 的相关文章

  • 有没有任何工具可以查看针对数据库运行的查询?

    是否有任何工具可以检查 asp net 或 sql server 并报告针对数据库运行的所有查询 我问这个问题的原因是我正在一个项目中使用 Linq 并且想要仔细检查它对每个页面实际执行的操作 理想情况下 我想在浏览器中查看页面并获得为创建
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • ASP.NET - 在 RenderContent 调用中将事件处理程序添加到 Repeater 内的 LinkBut​​ton

    我有一个加载自定义用户控件的 Sharepoint WebPart 用户控件包含一个 Repeater 而 Repeater 又包含多个 LinkBut ton 在 Web 部件的 RenderContent 调用中 我有一些用于添加事件处
  • ContentDialog 未与 UWP 中心对齐

    据我所知 ContentDialog的默认行为应该是使其在 PC 上居中并在移动设备上与顶部对齐 但就我而言 即使在 PC 上我也将其与顶部对齐 但我不明白发生了什么 我正在使用代码隐藏来创建它 这是我正在使用的代码片段 Creates t
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • Linq 合并列表

    我的课 public class Foo public int A get set public List
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 请求挂在 IIS 7.5 上的会话模块上

    有时 我网站上的一些请求开始挂在 Session 模块的 RequestAcquireState 状态上 当螺旋开始时 所有请求都会超时 我们需要在受影响的服务器上重新启动 IIS 我进行了很多调查 得到的唯一结论是 当应用程序尝试访问存储
  • 如何让XmlReader读取C#中的属性?

    我有一个 XML Stream 其中包含以下 XML 内容
  • 我在使用 ado.net 时收到错误 Argument 2 may not be pass with ref keywords

    int t 0 cmd Parameters AddWithValue Res ref t 我在第二行收到错误 参数 2 不能与 ref 关键字一起传递 您只能通过引用传递参数ref if the 范围 is a ref参数也是如此 Add
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 如何构建一棵与或树?

    我需要一个支持 与 和 或 的树结构 例如 给定一个正则表达式 如ab c d e 我想把它变成一棵树 所以 一开始我们有两个 或 分支 它可以向下ab or c d e 如果你低头ab分支 你得到两个节点 a and b or a其次是b
  • 使用数据绑定,如何将包含表情符号的文本绑定到标签并使其正确显示?

    我正在编写一个应用程序来连接 WordPress BuddyPress API 该应用程序将允许用户通过 API 相互发送消息 当这些消息包含表情符号时 我很难正确显示它们 以下是 API 返回的消息文本的简短示例 Hi x1f642 ho
  • Gremlin.net 文本包含等效项

    我正在使用 Gremlin net 库连接到 janus 图形服务器 我使用 cassandra 和弹性搜索进行数据存储和索引 在我使用的 gremlin 语言和 gremlin 控制台中文本包含在属性的文本中进行搜索 我正在使用混合索引
  • Xcode 7 调试器不会中断内联标头函数

    过去五年我一直在各种 C 项目中使用 Xcode 没有出现这个问题 今天 我打开了一个较旧的项目 大约 2 年前 并尝试通过在该函数中放置一个活动断点来调试头文件中的内联函数 由于某种原因 调试器不会中断此代码 但是 如果我在调用该函数的
  • 从对列表创建邻接列表类型结构

    在 C 中 我有 class Pair int val1 int val2 我有一个来自以下来源的配对列表 List
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 实体框架代码首次日期字段创建

    我正在使用实体框架代码优先方法来创建我的数据库表 下面的代码 创建一个DATETIME数据库中的列 但我想创建一个DATE柱子 DataType DataType Date DisplayFormatAttribute ApplyForma

随机推荐

  • Rails 3.2 中使用 gmail 或 SendGrid 时出现邮件程序身份验证错误

    我正在尝试从一个非常简单的 Rails 3 2 应用程序设置邮件 尝试过 Gmail 尝试过 SendGrid 得到同样的错误 Net SMTPAuthenticationError in UsersController create 53
  • pandoc 和 mathjax 遇到一些问题

    我正在尝试使用 pandoc 从包含一些乳胶的 markdown 文件生成 html 幻灯片 该文件是在github上 https raw github com rcalsaverini ThesisPresentation master
  • 在 Silverlight 中显示 GIF

    我的网络服务器上的文件夹中有许多 gif dir subdir bla gif etc 在同一台服务器上有一个 Silverlight 3 应用程序 ClientBin bla xap 有没有办法在 Silverlight 应用程序中显示
  • 禁用某些元素的 nganimate

    我正在使用 ngAnimate 模块 但是我所有的ng if ng show等 受其影响 我想利用 ngAnimate 来处理某些选定的元素 对于性能和元素中的一些错误 显示和隐藏速度非常快 thanks 如果您想为特定元素启用动画 而不是
  • WebDriverError:已断开连接:无法连接到渲染器

    Meta 操作系统 OSX 10 12 6 16G29 node modules chromedriver bin chromedriver v ChromeDriver 2 32 498537 cb2f855cbc7b82e20387ea
  • 如何确定 Neo4j 中节点内的属性值类型?

    目前 似乎没有办法确定节点 或关系 中的属性值是数组 集合还是字符串 匹配 n 其中 isArray n myprop 当尝试了解您正在使用的与更新和查询相关的数据类型时 这将非常方便 具体来说 如果您遇到这样的情况 您正在尝试更新属性值
  • 使用 With 绘图与使用 Block 绘图 (Mathematica)

    我想描述一个我一直遇到的问题Plot using With保持定义的参数 本地 我不一定要求解决 我遇到的问题是理解问题 有时我使用如下结构来获取绘图 Method 1 plot1 With vmax 10 km 10 Plot Evalu
  • C# 中的 TimeSpan 到本地化字符串

    有没有一种简单的方法 可能是内置的解决方案 来转换TimeSpan本地化字符串 例如new TimeSpan 3 5 0 将被转换为3 hours 5minutes 仅用波兰语 我当然可以创建自己的扩展 public static stri
  • 计算数据框中某列的百分比 - 按列“分组”

    我是 R 初学者 我需要能够计算数据框中值的百分比 但经常按其他列值 分组 我有一个大约 1000 行的数据框 包含媒体类型 版本 集合 年份 和计数 今年 我可以过滤它们 只获取特定的媒体 trSpdf lt trS trS Mediat
  • 同时进行多个异步回发 - ASP.NET

    说我有2个UpdatePanels在页面和每个UpdatePanel有一台服务器Button每个 当我单击第一个按钮 然后单击第二个按钮并查看 Firebug 时 我发现直到第一个按钮完成后才触发第二个异步回发 这是否按预期工作 我的理解是
  • Excel VBA打印机API,设置颜色和双面打印

    这是我的问题 我正在尝试访问打印机并更改颜色和双面设置 到目前为止 我拥有的代码允许我更改网络打印机的用户首选项 但我有以下两个问题 1 代码将打印机按预期设置为单面或双面 但未正确设置颜色首选项 2 Excel不会自动选择新设置 我仍然需
  • 如何使用 Spring security 创建自己的安全过滤器?

    我想知道是否可以使用 Spring Security API 在 Spring Web 应用程序中创建自己的安全过滤器 我想创建一个通用的安全过滤器 以便只需在 web xml 中添加该过滤器即可将其用于 插入 任何 Web 应用程序 安全
  • 如何动态分配函数代码?

    在 C 语言中 函数指针作为来自某个库的回调的通常途径是包含一个void 用户上下文的指针 void fp void ctx 允许库使用上下文调用回调ctx 假设我使用的库在回调中不包含上下文指针 我需要为每个上下文进行一个回调 在 C 中
  • Cordova Wrapper 应用程序,内部链接在应用程序中加载,外部链接在浏览器中加载

    我有一个简单的Cordova https cordova apache org 包装器应用程序指向外部网页 而不定义任何自己的视图 我想来自该域的所有内部链接都将加载到应用程序内 but 所有外部链接 http twitter com ht
  • 自定义 ostream

    我需要一些指导或指示来了解如何实现自定义 ostream 我的要求是 具有适用于多种数据类型的 目的是将输出发送到数据库 每个 行 应该进入一个单独的记录 每个记录最重要的字段是文本 或 blob 但其他一些字段 例如时间等 大多可以自动推
  • 如何在Cycle.js中顺序请求数据?

    我是响应式编程的新手 正在尝试使用cycle js 试图实现谁关注框本教程 https gist github com staltz 868e7e9bc2a7b8c1f754 但我知道 为了正确实施 和学习目的 我没有一项数据 完整的用户名
  • 使用 jquery 将类添加到父 div

    这应该相当容易 但由于某种原因我很挣扎 我有以下 html 结构 div class div div class changevid div 我想要的是当单击changevid时 应该在子内容之后添加一个名为 active 的类 my co
  • r data.table 就地连接多列

    data table是惊人的 我想进行就地联接 但保留两个表中的所有列 这个问题 https stackoverflow com questions 34598139 left join using data table 34600831演
  • MVC2 的 ASP.Net MVC Future 刷新

    随着 MVC2 的发布 MVC Futures 库的更新包含哪些值得注意的功能 MVC Futures 有两个版本与 MVC 2 RTM 并存 其中一个版本针对 NET 3 5 另一个目标是 NET 4 NET 4 版本不是 NET 3 5
  • 带返回值的 Hangfire 后台作业

    我要从Task Run https msdn microsoft com en us library hh195051 28v vs 110 29 aspx to Hangfire http docs hangfire io en late