Api 控制器中长时间运行的任务(使用 Web API,自托管 OWIN)

2024-05-17

我想在自托管 OWIN 环境中的 ApiController 中运行长时间运行的任务(例如 4-5 分钟)。但是,我想在开始该任务后(一旦开始长时间运行的任务)就发回响应,而不等待它完成。这个长时间运行的任务与 HTTP 无关,并且顺序运行一些可能需要很长时间的方法。

我看一下this http://www.hanselman.com/blog/HowToRunBackgroundTasksInASPNET.aspx博客文章并决定尝试一下QueueBackgroundWorkItem。但是,我不确定是否可以在自托管(控制台应用程序)owin环境中使用此方法或是否有必要使用它。在自托管控制台应用程序中,我认为应用程序本身管理请求,并且所有请求在同一个 AppDomain 中运行(应用程序默认 AppDomain,我们不创建任何新的 appDomain),所以我可能可以在一种一劳永逸的时尚,而不做任何特别的事情?

无论如何,当我使用QueueBackgroundWorkItem,我总是收到错误:

<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Operation is not valid due to the current state of the object.
</ExceptionMessage>
<ExceptionType>System.InvalidOperationException</ExceptionType>
<StackTrace>
at System.Web.Hosting.HostingEnvironment.QueueBackgroundWorkItem(Func`2 workItem) at BenchMarkService.SmokeTestController.IsItWorking() in C:\Devel\Code\Projects\BenchMarkService\BenchMarkService\SmokeTestController.cs:line 18 at lambda_method(Closure , Object , Object[] ) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments) at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()
</StackTrace>
</Error>

我还发现this https://stackoverflow.com/questions/17577016/long-running-task-in-webapi关于SO的问题,说实话,这对我来说似乎有点令人困惑,因为实现这一目标的唯一方法是IRegisteredObject or not?

我只是想在自托管应用程序中运行一个长时间运行的任务,我很欣赏对此的任何想法。我发现的几乎所有资源、问题都是基于asp .net,我不知道从哪里开始。


自托管 OWIN 应用程序通常是常规控制台应用程序,因此您可以像在控制台应用程序中那样执行一些长时间运行的任务,例如:

  • Task.Run
  • ThreadPool.QueueUserWorkItem
  • new Thread(...).Start()

在 IIS 托管的 ASP.NET 应用程序中,不建议使用此类方法,因为应用程序池通常会被回收,因此您的应用程序会经常关闭和重新启动。在这种情况下,您的后台任务将被中止。为了防止(或推迟)这种情况,API 像QueueBackgroundWorkItem已被介绍。

但是,由于您是自托管的并且不在 IIS 中运行,因此您可以只使用上面列出的 API。

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

Api 控制器中长时间运行的任务(使用 Web API,自托管 OWIN) 的相关文章

  • 使用MVVM Light的Messenger在视图模型之间传递值

    有人可以帮我解释一下 MVVM Light 的 Messenger 吗 我正在阅读 StackOverflow 上的一篇文章 MVVM 在视图模型之间传递值 https stackoverflow com questions 6392854
  • SQL Server CLR 与第 3 方 SDK 集成:缺少程序集 System.Drawing 时出错

    我正在开发一个解决方案 该解决方案将与第 3 方应用程序的 SDK 接口 并最终创建一个数据集以将数据迁移到我们的 SQL Server 2014 实例上的目标数据库中 该接口是通过 SQL Server CLR 存储过程实现的 在 C 端
  • C# CreatePipe() -> 受保护的内存错误

    我尝试使用 C 创建管道 代码非常简单 但是当行与CreatePipe 调用被执行我得到一个System AccessViolationException并出现以下错误消息 尝试读取或写入受保护的内存 这通常表明其他内存已损坏 这是我的表单
  • 从任务并行库更新 ProgressBar UI 对象

    基本上我想更新 FormMain WindowsForm 上的 ProgressBar UI 对象 我正在使用 NET 4 0 以下是 Form1 Designer cs 中的代码 namespace ProgressBarApp publ
  • 如何在 RestSharp 中使用 PUT?

    我想使用 PUT 但我只能找到如何使用 POST 的示例 我要发送的json数据是使用这个cURL命令发送的curl i H Content Type application json X PUT d status 1 http 192 1
  • iTextSharp 从一页模板高效批量生成 PDF

    我正在使用 ITextSharp 生成多页 PDF 每个页面都有相同的模板 问题是 PDF 的物理大小会随着模板的大小而增长 I HAVE to use 阿克罗菲尔德 我怎么能够reduce最终文件大小 这是 pdf 处理程序的代码片段 p
  • 将函数模板传递给其他函数

    假设我有一个函数可以对任意容器类型 C 11 执行某些操作 template
  • 将 0x1234 转换为 0x11223344

    如何高性能地将十六进制数0x1234扩展到0x11223344 unsigned int c 0x1234 b b c 0xff lt lt 4 c 0xf c 0xff0 lt lt 8 c 0xff00 lt lt 12 c 0xf00
  • 构造函数定义和声明不匹配

    我有以下 C 代码 其中声明中构造函数的参数与构造函数的定义具有不同的常量性 testClass hpp class testClass public testClass const int x testClass cpp testClas
  • 在 C# 中使用正则表达式重复模式

    我有一串话 词黑暗王辉光我们结束你好再见低翼 我需要找到第一个单词的最后一个字母与以下单词的第一个字母匹配的单词 例如 worD Dark 我写了一个正则表达式 b w w W 1 w b 目前它成功找到连续 2 个单词 Regex Mat
  • 用户注销速度非常快

    我正在使用 ASP NET 身份成员身份 这是 Startup Auth cs 代码 app CreatePerOwinContext EFDbContext Create app CreatePerOwinContext
  • 如何在C(Linux utf8终端)中打印“盒子抽屉”Unicode字符?

    我正在尝试显示 方框图范围 2500 257F 中的 Unicode 字符 它应该是标准 utf8 Unicode 标准 版本 6 2 我根本做不到 我首先尝试使用旧的 ASCII 字符 但 Linux 终端以 utf8 显示 并且没有显示
  • 在 C# 中创建我的对称密钥

    一直在审查一些对称加密方法 我看到了很多在类中硬编码私有静态变量的示例 通常类似于 string key THISISYOURENCRYPTIONKEY 然后在更远的地方 代码使用它来加密 解密 抛开正确的实现 算法 策略以及存储它的位置
  • 从用户控件访问父控件 - C#

    如何访问C winform 中用户控件的父控件 我使用以下代码 但它并不适用于所有类型的控件 例如 ListBox Control Co this TopLevelControl Controls Find label7 true Co 0
  • 使用 Elmah 进行异常处理

    我用 Elmah 记录异常 想知道我使用的技术是否是好的设计 现在 我捕获并重新抛出各种类和方法中发生的异常 并将它们记录到程序的主 try catch 块中的 Elmah 主程序 try Some code that fires off
  • 使用boost asio的线程池

    我正在尝试使用 boost asio 创建一个有限的线程池类 但我陷入了困境 有人可以帮助我吗 唯一的问题是我应该减少计数器的地方 代码无法按预期工作 问题是我不知道我的线程何时完成执行以及我如何知道它已返回池 include
  • 我可以以编程方式更改 Xamarin.Forms 中的 styles.xml 吗?

    我们有一个可自定义颜色的应用程序 这使得列表视图中所选项目的橙色 Android 默认值有时看起来很糟糕 我们想要更改列表视图所选项目的颜色 我知道如何在我们页面的后台代码 xaml cs 中执行此操作 并且我知道您可以在 styles x
  • 从文本文件中读取行并存储到数组中

    如何从文本文件中读取行并将其存储到数组中 例如 我有一个包含 45 行不同行的文本文件 我的尝试 int main int a 45 ifstream myfile enroll assg txt if myfile cout lt lt
  • C# 4.0 动态对象和 WinAPI 接口,如 IShellItem(无需在 C# 源代码中定义它们)

    是否可以 使用 C 4 0 中的新动态关键字 使用接口 如 IShellItem 或其他 WinAPI 接口 而无需在 C 源代码中定义它们 或者至少不定义接口成员 我正在尝试类似的事情 const string IShellItemGui
  • 在c#中搜索支持rar格式的压缩库

    我想在我的应用程序中添加功能来解压缩 并可选择压缩 各种格式的文件 我有支持 zip gzip 7zip 和 bzip2 的库 但还是没有找到支持rar的库 我知道 rar 是商业的 但也许有一些 net 库可用于解压缩 rar s 最好是

随机推荐

  • 当与“<”或“>”运算符一起使用时,MySQL 不使用 DATE 上的索引吗?

    我正在使用解释来测试这些查询 col 类型是 DATE 这使用索引 explain SELECT events FROM events WHERE events date 2010 06 11 这不 explain SELECT event
  • 使用 Python Mechanize 与 Flash 交互

    我正在尝试用 Python 创建一个处理 Flash 的自动化程序 现在我正在使用Python Mechanize 它非常适合填写表格 但是当涉及到flash时我不知道该怎么办 有谁知道我如何通过 Python mechanize 或其他一
  • 为什么 Double.TryParse() 对于包含 double.MaxValue 或 double.MinValue 的字符串返回 false?

    我有一个静态方法 它接受一个字符串作为输入 如果该字符串代表一个数字 则返回原始输入字符串 如果字符串不代表数字 则处理输入字符串并返回转换后的字符串 我正在写测试用例 我正在尝试验证包含以下任一内容的输入字符串double MinValu
  • JavaFX ReadOnlyListProperty 不是只读的?

    这段代码抛出 UnsupportedOperationException 正如我所期望的那样 因为它是只读的 ListProperty
  • 如何在文件系统中存储图像

    目前 我已将图像 最大 6MB 作为 BLOB 存储在 InnoDB 表中 随着数据大小的增长 夜间备份变得越来越慢 阻碍了正常性能 因此 二进制数据需要进入文件系统 指向文件的指针将保存在数据库中 数据具有树状关系 main site u
  • QT从QTableWidgetItem继承到Widget并覆盖'<'运算符

    我想要一个QTableWidget具有定制的某些单元QProgressBars 并且我希望能够对包含这些的列进行排序 我的定制QProgressBar继承自两者QProgressBar and QTableWidgetItem 并且我正在覆
  • 使用 setAttribute() 添加“onclick”函数

    为什么以下不起作用 显然该功能尚未添加 function activatetypeinput event devtype The function is called but it doesn t set the attribute var
  • 在Python中切片以反转列表的一部分

    我有一个列表 我想从后到尾提取其中的子切片 用两行代码 这是 mylist mysublist mylist begin end mysublist mysublist 1 是否有切片符号可以在一行中获得相同的效果 这 mysublist
  • 从 java sdk 向对等方发送提案时出现访问被拒绝错误

    我正在尝试使用以下代码查询区块链并收到访问被拒绝错误 我也遇到同样的错误sendTransactionProposal方法也是如此 UserContext adminUserContext RegisterEnrollUser regist
  • 如何从迭代器推导连续内存

    不知何故 本土stl copy VC Dinkumware 上的算法表明它可以使用memcpy 可以轻松复制的数据 一个凡人能做到这一点吗 假设每个元素都是普通可复制的 random access iterator 是否意味着连续内存 标准
  • django AuditTrail 与还原

    我正在开发一个新的网络应用程序 我需要将数据库中的任何更改存储到审核表中 此类审计表的目的是 稍后在真正的物理审计中 我们可以确定在某种情况下发生了什么 谁编辑了什么以及数据库当时的状态是什么 复杂的计算 所以大多数审计表将被写入而不是读取
  • 如何将 int[] 转换为 uint8[]

    所以 我需要你的帮助 我找不到关于该主题的任何内容 Golang 是一门刚刚诞生的语言 所以对于像我这样的新手来说很难快速找到答案 预先声明的 Goint类型大小是特定于实现的 32 位或 64 位 数字类型 http golang org
  • AppCompat v21 工具栏更改徽标大小

    我正在从以前的操作栏迁移到 appcompat v21 中的新工具栏功能 我仍然想将徽标保留在操作栏 工具栏 的左上角 为此 我在布局中添加了支持工具栏 并为其创建了一个新的工具栏 app theme style NewToolBarSty
  • 如何重新定位或移动 Google Maps SDK 上的当前位置按钮?

    如何将 Objective C 中的当前位置按钮移至我的偏好 现在 我已启用它 但底角有东西挡住了它 Thanks 您可以使用 padding 将按钮向上移动 self mapView padding UIEdgeInsets top 0
  • 使用 posix shell 测试字符串中的正则表达式

    如何测试字符串是否与特定字符串匹配正则表达式与基本 无 bash 或任何其他 posix shell 脚本 在 if 语句中 您可以使用expr在 POSIX shell 中计算正则表达式的命令 s Abc expr s alpha 3 e
  • 如何确定 std::function 的参数数量?

    我有以下问题 假设您想编写一个可以采用 lambda 表达式的通用函数 我知道如果参数是 std function 类型 那么我不仅可以使用 lambda 还可以使用函数 甚至可以使用函数指针 所以第一步 我做了以下事情 void prin
  • 工厂模式中创建者的角色

    我无法理解为工厂类定义抽象类 接口的作用 这是我在网络上的所有教程中总是看到的东西 有人可以阐明 CreatorInterface 的重要性吗 工厂模式参考UML图 https i stack imgur com 3VpUM png 为了以
  • 在 .NET 程序集或可执行文件中嵌入文本文件[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 NET 程序集中嵌入文本文件 https stackoverflow com questions 433171 how to embed a text file in a net assemb
  • 通过套接字发送动态数组(在记录内)?

    我正在尝试直接使用 SendBuf 将记录从服务器传输到客户端 但是 该记录有一个动态数组的成员 并且我在某处 在 SOF 中 读到 发送记录时 成员必须是静态的 固定长度 但问题是 我无法确定如何我会 将来 发送许多论点 我怎么解决这个问
  • Api 控制器中长时间运行的任务(使用 Web API,自托管 OWIN)

    我想在自托管 OWIN 环境中的 ApiController 中运行长时间运行的任务 例如 4 5 分钟 但是 我想在开始该任务后 一旦开始长时间运行的任务 就发回响应 而不等待它完成 这个长时间运行的任务与 HTTP 无关 并且顺序运行一