队列管理和新线程

2024-04-09

在 .Net 4.0 框架上使用 C#,我有一个 Windows 窗体主线程(迄今为止唯一的一个)等待文件系统事件,然后必须对这些事件提供的文件启动一些预定义的处理。

我计划执行以下操作:

  • A1。当主进程启动时立即创建一个单独的线程;
  • A2。让主线程将文件名放入队列(FIFO)中 处理;
  • A3。让计时器每 n 触发一次新线程 秒;
  • A4。如果有项目,则让新线程读取队列 执行处理,然后让它取消队列项目 处理。

因为我以前从未编写过线程(我基本上使用 Albahari 作为我的指南针),但我绝对想这样做,所以我有几个问题只是为了提前发现可能的严重头痛:

  • Q1.如果主进程仅写入而新进程仅取消队列项目,我可能会在队列上遇到并发问题吗?换句话说:在这种情况下,同步是一个重要问题吗?
  • Q2。我已经看到我可以从头开始创建一个新线程,或者可以重用现有池中提供的线程之一。在这种情况下使用池中的线程更安全/更简单吗?
  • Q3。无限期地保持新线程活动并仅响应计时器直到主进程关闭是否有任何缺点?

如果您的目标是 .Net Framework 4,阻塞收集 http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT听起来它会解决你的问题;即,当“工作”项在队列上可用时(添加新文件时添加到事件处理程序上的队列),创建一个新的线程池线程,并在该线程上异步处理它们。

您可以在生产者/消费者队列中使用一个队列:

E.g.:

/// <summary>
/// Producer/consumer queue. Used when a task needs executing, it’s enqueued to ensure order, 
/// allowing the caller to get on with other things. The number of consumers can be defined, 
/// each running on a thread pool task thread. 
/// Adapted from: http://www.albahari.com/threading/part5.aspx#_BlockingCollectionT
/// </summary>
public class ProducerConsumerQueue : IDisposable
{
    private BlockingCollection<Action> _taskQ = new BlockingCollection<Action>();

    public ProducerConsumerQueue(int workerCount)
    {
        // Create and start a separate Task for each consumer:
        for (int i = 0; i < workerCount; i++)
        {
            Task.Factory.StartNew(Consume);
        }
    }

    public void Dispose() 
    { 
        _taskQ.CompleteAdding(); 
    }

    public void EnqueueTask(Action action) 
    { 
        _taskQ.Add(action); 
    }

    private void Consume()
    {
        // This sequence that we’re enumerating will block when no elements
        // are available and will end when CompleteAdding is called.
        // Note: This removes AND returns items from the collection.
        foreach (Action action in _taskQ.GetConsumingEnumerable())
        {
            // Perform task.
            action();
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

队列管理和新线程 的相关文章

  • 是否有与 posix_memalign 对应的 C++ 版本?

    当我打电话时posix memalign http man7 org linux man pages man3 posix memalign 3 html为类型的对象分配对齐的内存Foo在我的 C 代码中 我需要做一个reinterpret
  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 代码 GetAsyncKeyState(VK_SHIFT) & 0x8000 中的这些数字是什么?它们是必不可少的吗?

    我试图在按下按键的简单动作中找到这些数字及其含义的任何逻辑解释 GetAsyncKeyState VK SHIFT 0x8000 可以使用哪些其他值来代替0x8000它们与按键有什么关系 GetAsyncKeyState 根据文档返回 如果
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • Visual Studio 在构建后显示假错误

    我使用的是 Visual Studio 2017 构建后 sln在调试模式下 我收到错误 但是 当我通过双击错误列表选项卡中的错误来访问错误时 错误会从页面中消失 并且错误数量也会减少 我不太确定这种行为以及为什么会发生这种情况 有超过 2
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • OpenGL:仅获取模板缓冲区而没有深度缓冲区?

    我想获取一个模板缓冲区 但如果可能的话 不要承受附加深度缓冲区的开销 因为我不会使用它 我发现的大多数资源表明 虽然模板缓冲区是可选的 例如 排除它以利于获得更高的深度缓冲区精度 但我还没有看到任何请求并成功获取仅 8 位模板缓冲区的代码
  • 这个可变参数模板示例有什么问题?

    基类是 include
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • Objective-C / C 给出枚举默认值

    我在某处读到过关于给枚举默认值的内容 如下所示 typedef enum MarketNavigationTypeNone 0 MarketNavigationTypeHeirachy 1 MarketNavigationTypeMarke

随机推荐

  • 为什么 Qt 无法识别我的头文件?无法打开包含文件 没有这样的文件或目录

    我的 pro 文件中有以下内容 并且我有以下文件 include headerhere 例如 include StdAfx h 不过我得到了 错误无法打开包含文件 StdAfx h 没有这样的文件或目录 无论我使用还是出现同样的错误 inc
  • 如何更新嵌套对象数组的值

    这是我的实际数组 let mainArray value AG TURF 123 label Ag Turf checked false id 123 children value AG TURF 123 TRACTOR 456 label
  • 自定义View可以知道onPause已经被调用了吗?

    我有一个运行线程操作的自定义视图 该操作定期调用互联网 我想知道是否有一种方法可以让我不必从父 Activity onPause 中杀死该线程 以便在 Activity 后台运行 和 或杀死 后 线程不会在后台闲逛 这里的目的是让自定义视图
  • Javacard 中的 ECDSA 签名

    我正在 Javacard 中使用 ECDSA 实现签名代码 我的代码在异常部分输出 0x0003 NO SUCH ALGORITHM 这意味着该卡不支持该算法 我不明白这一点 因为我的供应商告诉我它支持 ECC 我的结论是 我不知道如何使用
  • org.json.JSONException:名称没有值

    下面的代码中出现此错误的原因可能是什么 loginButton setOnClickListener new View OnClickListener Override public void onClick View v final St
  • 获取系统中已安装的应用程序

    如何使用c 代码获取系统中安装的应用程序 遍历注册表项 SOFTWARE Microsoft Windows CurrentVersion Uninstall 似乎可以提供已安装应用程序的完整列表 除了下面的示例之外 您还可以找到与我所做的
  • SKPhysicsJoint:接触和碰撞不起作用

    在 IOS7 1 上 使用 SpriteKit 我创建了两个简单的矩形精灵以及相应的物理体 我设置了接触和碰撞位掩码 所有工作都完全符合我的预期 检测到接触并且碰撞防止两个矩形重叠 但是 当我创建 SKPhysicsJointSpring
  • java中相关对象的序列化

    假设我有 A B 和 C 类型的对象 我有 3 个 Map 分别包含 A B 和 C 的所有实例 在内部 A和B都有C的Map 我希望能够随时存储和恢复应用程序的状态 因此 直到今天我总是序列化类似金字塔的应用程序 我会在顶部对象上调用序列
  • PostgreSQL Sqlalchemy 提交需要大量时间

    当我尝试将更改提交到表中时 需要花费大量时间 每 1000 行大约 300 秒 型号类别 class Quotes base tablename quotes id Column INTEGER primary key True autoi
  • Apache + mod_wsgi 与 nginx + Gunicorn

    我想部署一个django站点 它是github上的开源edx代码 我面临着使用之间的选择 Apache 与 mod wsgi nginx 与 Gunicorn 我已经将 Apache 与 mod wsgi 一起使用 它很酷 但我对第二个选项
  • SQL Server Reporting Services 对聚合数据运行总计

    每个人 在 SSRS 中 我们有 2 列 如下所示 Sales Running Sales 5 00 5 00 3 00 8 00 1 00 9 00 区别在于 第一列 销售额 是一个分组行 因此要获取每行的销售额总计 我们使用 Sum F
  • Mathematica:为什么 3D 绘图会记住最后的视点/旋转,即使在再次评估后也是如此?

    我觉得这有点烦人 我制作了一个 3D 绘图 最初它以默认方向出现 然后 我使用鼠标以某种方式旋转它 现在我再次运行该命令 期望获得原始形状 即通过鼠标旋转它之前的原始方向 但相反 它只是给了我与屏幕上相同的绘图 即它似乎保留 记住了该输出单
  • 从函数返回结果(javascript、nodejs)

    谁能帮我处理这段代码吗 我需要从 routeToRoom 函数返回一个值 var sys require sys function routeToRoom userId passw var roomId 0 var nStore requi
  • Memcache 统计数据理解

    Memcache telnet 接口有命令称为STATS 它显示了很多数字 我在哪里可以看到它的含义 如何分析它们 多少缓存使用是有效的等等 更新的文档位于https github com memcached memcached blob
  • 在我更改 PHP 设置后,gzopen 函数不存在 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 使用新的 PHP 5 4gzopen
  • Firebase 推送通知不适用于 iOS

    我想使用 Firebase Cloud Messaging 实现推送通知 我已经按照说明设置了我的项目并上传了 APN 证书 我正在使用发送测试消息fcmtoken到我的真实设备 我在AppDelegate中的配置如下 func appli
  • 是否可以在不同的类中编写/包装异常处理组件(try、catch)?

    这是关于将异常处理逻辑包装在某种类中 在写c 的时候 代码中 很多时候我们需要根据客户端抛出的异常来捕获许多类型 变体 这导致我们在 catch 子句中 多次 编写类似类型的代码 在下面的示例中 我编写了 function 它可以以多种可能
  • Access 2010 SQL 查询仅在完整单词的字符串中查找部分匹配

    我希望这是一个简单的 我只是找不到如何获得我想要的结果 也许我在 SQL 中使用了错误的关键字 我正在搜索包含全名字段的员工表 该字段可以是 Sam 或 Evans 先生 或 Sam Evans 先生 我正在尝试查找与另一个包含名称字段的名
  • RecyclerView onClick 无法正常工作?

    我在片段中使用 RecyclerView 来显示带有网格格式文本的图像 Recycler 视图 grid item xml 如下所示
  • 队列管理和新线程

    在 Net 4 0 框架上使用 C 我有一个 Windows 窗体主线程 迄今为止唯一的一个 等待文件系统事件 然后必须对这些事件提供的文件启动一些预定义的处理 我计划执行以下操作 A1 当主进程启动时立即创建一个单独的线程 A2 让主线程