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队列处理 的相关文章

随机推荐

  • 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