ASP.NET 5 中的 RegisterObject/QueueBackgroundWorkItem 等效项是什么

2023-12-21

在“System.Web”ASP.NET中,可以通过以下方式注册后台工作RegisterObject/QueueBackgroundWorkItem为了参与 IIS 的关闭序列(完成 90 秒的宽限期),但我正在努力寻找 ASP.NET 5 中的确切等效项。

查看源代码Microsoft.AspNet.Hosting.HostingEngine https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNet.Hosting/HostingEngine.cs#L32,我可以看到它通过信号发出IApplicationLifecycle.ApplicationStopping and IApplicationLifecycle.ApplicationStopped(在其之间放置服务器和PipelineInstance),但似乎没有任何空间需要 90 秒的宽限期RegisterObject在旧的 API 中。

IIS 集成层尚未开源(如果有的话),因此很难了解该实现如何映射事物。

我缺少 API 吗?我应该通过以下方式执行阻塞关闭吗CancellationToken.Register()?这是“v1 of vNext”中遗漏的东西吗?

任何启发将不胜感激。


我使用基于 Katana 的 Hangfire 实现作为灵感创建了以下内容。除了检查 IIS Express 终止时关闭代码是否运行之外,它没有进行任何测试,但它可以作为概念证明。

这里的设计很明显not对于“即发即忘”任务,因为它们可以在关闭之前触发。然而,它确实适用于幂等队列处理器之类的东西(假设空闲关闭超时已被禁用)

public static class BackgroundServiceExtensions
{
    public static void UseBackgroundService(
        this IApplicationBuilder builder, Func<CancellationToken, Task> service)
    {
        var lifetime = (IApplicationLifetime)builder.ApplicationServices
            .GetService(typeof(IApplicationLifetime));

        var stoppingToken = lifetime.ApplicationStopping;
        var stoppedToken = lifetime.ApplicationStopped;

        // This, in particular, would need to be properly thought out, 
        // preferably including an execution context to minimise threadpool use  
        // for async-heavy background services
        Task serviceTask = Task.Run(() => service(stoppingToken));

        stoppedToken.Register(() =>
        {
            try
            {
                // Block (with timeout) to allow graceful shutdown
                if (!serviceTask.Wait(TimeSpan.FromSeconds(30)))
                {
                    // Log: Background service didn't gracefully shutdown. 
                    //      It will be terminated with the host process
                }
            }
            catch(Exception)
            {
                // Ignored
            }
        });
    }
}

然后可以像这样使用:

app.UseBackgroundService(async cancellationToken =>
{
    while (!cancellationToken.IsCancellationRequested)
    {
        System.Diagnostics.Debug.WriteLine("Tick...");

        try
        {
            // Use cancellationToken for anything that is (logically) cancellable
            await Task.Delay(1000, cancellationToken);
        }
        catch(TaskCanceledException)
        { }
    }

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

ASP.NET 5 中的 RegisterObject/QueueBackgroundWorkItem 等效项是什么 的相关文章

随机推荐

  • Chef 中的引导问题

    我已经使用 Chef 设置了基本的基础设施 这包括本地厨师服务器 基于 ubuntu 工作站和基于 ubuntu 的服务器 用作节点 请注意 整个基础设施都位于我办公室网络的防火墙后面 我已经为服务器访问互联网做了必要的代理设置 所以这就是
  • QT KernelBase!RaiseException 位于 0x759fc41f

    评论多于问题 下面描述了我今晚遇到的一个问题以及我如何 纠正 它 这些事件需要几个小时的时间才能解决 由于该网站是我最喜欢的信息来源之一 因此认为这篇文章可能对其他人有益 欢迎任何有关诊断 QT Creator 运行时异常的建设性意见 该异
  • 当属性 Visibility 更改时为 StackPanel 制作动画

    在 WPF 3 5 带有 SP1 中 我只是当我更改属性可见性时 我想为 StackPanel 制作动画 我不知道这个 StackPanel 的高度 因为它的内容决定了它的高度 因此 当我将 StackPanel 的属性更改为 Visibl
  • 使用 jQuery .load 函数刷新元素而不重复它

    当用户点击提交按钮时 div forum应该刷新 不刷新页面 然而 由于某种原因 它反而创建了一个新的 div forum在原始 div 中 如下所示 虽然我知道我可以通过在 div 周围添加一个容器来防止这种情况 forum 我想知道是否
  • 使用 NAudio 将流数据保存到 WAV 文件

    我想将传入的流数据保存到硬盘驱动器上的 WAV 文件中 如何更改下面的代码才能将流录制到有效的 WAV 文件中 来自演示here http naudio codeplex com SourceControl changeset view a
  • 收到 icmp 请求,但没有回复 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 这个问题似乎不是关于主要由程序员使用的特定编程问题 软件算法或软件工具 help on topic 如果您认为该问题与主题相关另一个 St
  • 如何处理ggplot2中的“data of class uneval”错误?

    在尝试将新行覆盖到现有行时ggplot 我收到以下错误 Error ggplot2 doesn t know how to deal with data of class uneval 我的代码的第一部分工作正常 下图是来自美国中西部电力市
  • AVPlayer 播放 iOS 7 后台通知中的音频

    I have audio fetch and remote notification set in UIBackgroundModes我通过以下方式成功接收了我的应用程序在后台 未激活 的远程通知 void application UIAp
  • 在 Step Function 内循环

    我试图在循环中调用步骤函数中的几个步骤 但我无法弄清楚我需要如何执行此操作 这是我现在所拥有的 我需要添加另一个 lambda 函数 GetReviews 然后它将循环调用 CreateReview SendNotification 我该怎
  • 使用 UniformGrid 的列表框 - 项目未居中

    我有一个使用 UniformGrid 作为 ItemsPanelTemplate 的列表框 这是一个照片列表 我希望照片在网格的每个单元格的中心水平居中 但似乎无论我做什么 图像都会与每个单元格的左侧对齐 这是我当前的 XAML
  • Asp.Net、SQL 和时区

    有人问过 但我正在努力掌握如何在网络应用程序中处理时区的概念 我有一个跟踪项目进度的系统 我的 SQL Server 数据库中有一个 ProjectStartDate DATE 还有一些字段和表格 但让我们重点关注其中一个 服务器位于美国某
  • 有没有办法在 MySQL 中修剪多个字符(忽略它们的组合)?

    我想从 MySQL 中的字符串中删除前导空格和尾随空格 SP n t 最终 r 数据已经在 MySQL 表中 我无法检索它们以在 PHP 中处理 因为这应该太慢了 我尝试过这种语法 UPDATE table set field TRIM B
  • 为python请求get函数添加装饰器

    我正在寻找一种方法来添加某种适用于所有实例的装饰器requests get被用在任何函数中 例如 my custom decorator def hello r requests get https my api url The my cu
  • Eclipse 报告 JSP 文件中的语法错误,但应用程序可以运行

    我正在检查一个 JAVA 项目的代码库 我发现 Eclipse 在以下几行显示错误
  • Qt Creator 中的 Valgrind

    使用 Qt Creator 的 Memcheck 函数返回以下内容 valgrind Bad option xml yes but no XML destination specified valgrind xml yes has been
  • 如何在 Silverlight 中获取按钮按下事件之外的鼠标按钮状态?

    我有以下情况 我处理在 Silverlight 应用程序中按下鼠标左键的时间 并在按住鼠标和移动鼠标时执行一些操作 当释放左按钮时 我关闭告诉它执行该操作的标志 然后鼠标移动处理程序不再执行该操作 问题是 如果用户位于控制区域中 按下左键并
  • 来自角度应用程序的 Rest api 调用将错误传递给确实的 api

    下面是我创建的一个角度服务 用于从 Indeed 职位搜索 api 返回搜索结果 function use strict angular module career resources factory JobSearchService ht
  • C# 中最常见的命名约定是什么?

    C 中类 命名空间和方法最常见的命名约定是什么 像 Java 中那样有 getter setter 风格的方法很常见吗 名称指南 http msdn microsoft com en us library ms229002 aspx fro
  • 代号一动画麻烦(也在纸牌演示中)?

    代号一号 动画发生了什么 我使用了很多它们 截至 12 月 我的应用程序不再工作 当我六月离开时 一切都很好 一年多以来都是如此 我的应用程序是一款跳棋 跳棋 游戏 自 2013 年起就在应用程序商店中提供 在观看 CN1 Poker 演示
  • ASP.NET 5 中的 RegisterObject/QueueBackgroundWorkItem 等效项是什么

    在 System Web ASP NET中 可以通过以下方式注册后台工作RegisterObject QueueBackgroundWorkItem为了参与 IIS 的关闭序列 完成 90 秒的宽限期 但我正在努力寻找 ASP NET 5