带返回值的 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 后台作业 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中的 IPC 机制 - 用法和最佳实践

    不久前我在 Win32 代码中使用了 IPC 临界区 事件和信号量 NET环境下场景如何 是否有任何教程解释所有可用选项以及何时使用以及为什么 微软最近在IPC方面的东西是Windows 通信基础 http en wikipedia org
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l

随机推荐

  • 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