TPL队列处理

2023-12-02

我目前正在开发一个项目,我需要将一些作业排队进行处理,这是要求:

  1. 作业必须一次处理一个
  2. 排队的项目必须能够等待

所以我想要类似的东西:

Task<result> QueueJob(params here)
{
   /// Queue the job and somehow return a waitable task that will wait until the queued job has been executed and return the result.
}

我尝试过让后台运行任务仅从队列中取出项目并处理作业,但困难在于从后台任务到该方法。

如果需要的话,我可以选择在 QueueJob 方法中请求完成回调的路线,但是如果我可以获得一个透明的任务,允许您等待要处理的作业(即使有作业),那就太好了在队列中的前面)。


你可能会发现TaskCompletionSource<T>很有用,它可以用来创建一个Task它会在您想要的时候完全完成。如果你把它与BlockingCollection<T>,你会得到你的队列:

class JobProcessor<TInput, TOutput> : IDisposable
{
    private readonly Func<TInput, TOutput> m_transform;

    // or a custom type instead of Tuple
    private readonly
        BlockingCollection<Tuple<TInput, TaskCompletionSource<TOutput>>>
        m_queue =
        new BlockingCollection<Tuple<TInput, TaskCompletionSource<TOutput>>>();

    public JobProcessor(Func<TInput, TOutput> transform)
    {
        m_transform = transform;
        Task.Factory.StartNew(ProcessQueue, TaskCreationOptions.LongRunning);
    }

    private void ProcessQueue()
    {
        Tuple<TInput, TaskCompletionSource<TOutput>> tuple;
        while (m_queue.TryTake(out tuple, Timeout.Infinite))
        {
            var input = tuple.Item1;
            var tcs = tuple.Item2;

            try
            {
                tcs.SetResult(m_transform(input));
            }
            catch (Exception ex)
            {
                tcs.SetException(ex);
            }
        }
    }

    public Task<TOutput> QueueJob(TInput input)
    {
        var tcs = new TaskCompletionSource<TOutput>();
        m_queue.Add(Tuple.Create(input, tcs));
        return tcs.Task;
    }

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

TPL队列处理 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • Environment.CurrentDirectory 与 System.IO.Directory.GetCurrentDirectory

    我正在编写一个 Net WinForms 并不断在调试和发布配置之间切换 并且有一些文件我需要任一配置才能访问 我想做的是将文件放在 BIN 文件夹中的公共目录中 这样它看起来像这样 MyProject Bin CommonFiles My
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 如何将 SOLID 原则应用到现有项目中

    我对这个问题的主观性表示歉意 但我有点卡住了 我希望之前处理过这个问题的人能够提供一些指导和建议 我有 现在已经成为 一个用 C 2 0 编写的非常大的 RESTful API 项目 并且我的一些类已经变得巨大 我的主要 API 类就是一个
  • extern 声明和函数定义都在同一文件中

    我只是浏览了一下gcc源文件 在gcc c 我发现了类似的东西 extern int main int char int main int argc char argv 现在我的疑问是extern是告诉编译器特定的函数不在这个文件中 但可以
  • RestSharp获取序列化输出

    我正在寻找一种方法来访问 AddBody 调用的序列化结果 我正在使用内置的 RestSharp 序列化器 例子 class Foo public string FooField void SendRecord var f new Foo
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 模板外部链接?谁能解释一下吗?

    模板名称具有链接 3 5 非成员函数模板可以有内部链接 任何其他模板名称应具有外部链接 从具有内部链接的模板生成的实体与在其他翻译单元中生成的所有实体不同 我知道使用关键字的外部链接 extern C EX extern C templat
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • Visual Studio 2015 - Web 项目上缺少共享项目参考选项卡

    我从 MSDN 订阅升级到 Visual Studio 2015 因为我非常兴奋地阅读有关共享项目的信息 当我们想要做的只是重用代码时 不再需要在依赖项中管理 21382 个 nuget 包 所以我构建了一个测试共享项目 其中包含一些代码
  • 为什么空循环使用如此多的处理器时间?

    如果我的代码中有一个空的 while 循环 例如 while true 它将把处理器的使用率提高到大约 25 但是 如果我执行以下操作 while true Sleep 1 它只会使用大约1 那么这是为什么呢 更新 感谢所有精彩的回复 但我
  • 我可以使用 lambda 函数或 std::function 对象来代替函数指针吗?

    我有一个需要使用的库 它定义了以下内容 typedef void CallbackFunction const int i 并且有一个注册回调的函数 如下所示 void registerCallback CallbackFunction p
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • MySQL - 如何连接两个表而不重复?

    我有两个如下表 hotels hotelID hotelName 第二张桌子 operators opID opName opServices opHotelID 简短的解释 在第一个表中 我有很多酒店 它们都有一个唯一的增量 id 第二个
  • 定位边界二维实体

    给定一个点和一组任意 2D 实体 圆 多边形 直线 折线 圆弧等 有谁知道现有的策略 确定该点是否被任何实体组合包围 界定 我知道对闭合形状进行 内部 测试很容易 但这并不总是能给我想要的东西 特别是对于嵌套或相交的形状 找到围绕我的点形成
  • 在 pandas 数据框中完全打印很长的字符串

    我正在为看似非常简单的事情而挣扎 我有一个包含很长字符串的 pandas 数据框 df pd DataFrame one one two This is very long string very long string very long
  • Python 3.9.1 的 dlib 安装错误。如何知道哪个版本兼容?

    我已经安装了 CMake 现在正在尝试为人脸识别项目安装 dlib 我看过一些视频 问题似乎是兼容性问题 对于 Python 3 9 1 哪个版本的 dlib 更兼容 我尝试使用 pip 安装 dlib 手动下载它 但仍然显示以下错误 WA
  • 当原型包含对象时访问“this”值?

    我有一个class像这样 function Foo this current 1 Foo prototype history Foo prototype history back function if this current undef
  • SQL复杂动态透视2

    您好 我正在尝试在 SQL Server 中进行下表的旋转 REFID COL1 COL2 Sequence 1 abc cde 1 1 lmn rst 2 1 kna asg 3 2 als zkd 2 2 zpk lad 1 我想要的输
  • 尽管有通用约束,C# 类型转换还是错误

    为什么在类 P 的类型参数 T 的泛型约束为 必须从 A 继承 的情况下 第一次调用会成功 但第二次调用会失败 并出现注释中详细说明的类型转换错误 abstract class A static class S public static
  • 三元条件中的意外标记中断

    下面的函数旨在以数组形式从 可能嵌套的 对象返回值 列表参数可以是任何对象 如果我将break语句移到for循环之后 我不会收到任何错误 但当然我的函数不会按需要运行 我使用break的方式有什么问题吗 function listToArr
  • Eclipse - 无法从“https://services.gradle.org/distributions/gradle-2.1-bin.zip”安装 Gradle 发行版

    我正在尝试在 Eclipse 中创建一个新的 gradle 项目 由于安全原因 Eclipse无法下载任何插件 软件 当我尝试创建 gradle 项目时 出现以下错误 无法找到请求目标的有效证书路径 可能 不安装 Gradle 发行版 ht
  • 定义我的轴的限制,但在两个方向上具有相同的比例[重复]

    这个问题在这里已经有答案了 我如何结合这些陈述 pyplot axis 1234 0 1773 0 497 0 1362 0 pyplot axis equal 我只想定义轴的限制 但在两个方向上具有相同的比例 PS 我试过了pyplot
  • 在 Python 中将 GET 请求代理到不同的站点

    我想将从客户端收到的 GET 请求转发到另一个站点 就我而言 m3u8 播放列表请求流媒体站点进行处理 有谁知道该怎么做 如果要代理 请先安装requests pip install requests 然后 获取服务器中的文件并提供内容 e
  • Solr 拼写检查:无法显示结果,总是收到相同的错误

    所以 我对 solr 还很陌生 也许我有很多理解问题 我现在想做的是对我的搜索栏的自动建议 例如 如果您写 glves 结果应该是 gloves 这是一个自动完成功能 现在运行良好 但是 当然 当我输入 glves 时 什么也没有出现 现在
  • android @Suppress 错误与 @TargetApi

    有时 我会为可能运行我的应用程序的某些 Android 版本编写代码 使用最新 Android 工具的 Eclipse 仍然注意到我的 Manifest 文档允许较低版本的 Android 因此判定我的代码中有错误 解决这个问题的方法是添加
  • AX的源文件存放在哪里?

    我想 仅 对 Dynamics Ax 2009 的源文件 即 XPO 源文件 运行定期 每 4 小时 备份 我想知道它们的物理存储位置 AX7 所有元数据都以 XML 形式存储 方法也存储在常规文件中 并存储在版本控制中 See 本概述 A
  • 如何为 Dash/Plotly 中的下拉菜单命名

    我对破折号还很陌生 我试图弄清楚如何将名称放置在下拉菜单和滑块上方 并在它们之间提供一些间隙 我在侧面而不是在下拉列表的顶部得到这些名称 数据集 模型类型 这是我一直在使用的代码 html Div className row childre
  • 如何使用 iTextSharp 将 HTML 转换为 PDF

    我想使用 iTextSharp 将以下 HTML 转换为 PDF 但不知道从哪里开始 p This em is em span class headline some span strong sample em text em strong
  • Arrays.binarySearch 无法正常工作

    我有字符串数组 1 2 3 我使用 Arrays binarySearch 搜索所有这些数字 它找到 1 和 2 但对于 3 它返回 1 知道为什么会这样吗 什么是比始终在数组 集合中进行搜索更好的替代方案 数组必须是有序的 String
  • 大矩阵的 SciPy 插值

    我有一个 ndarray Z 在矩形网格 X Y 上有大约 500000 个元素 现在我想在 x y 中的大约 100 个位置处插入值 这些位置不一定在网格上 我有一些在 Matlab 中运行的代码 data interp2 X Y Z x
  • str_extract 特定模式(示例)

    我对正则表达式语法仍然有点困惑 你能帮我解决这些模式吗 A00 A1234B A00 A12345B A1 A12345 到目前为止我的方法 vapply strsplit files function files files nchar
  • TPL队列处理

    我目前正在开发一个项目 我需要将一些作业排队进行处理 这是要求 作业必须一次处理一个 排队的项目必须能够等待 所以我想要类似的东西 Task