c# - c# 中正确的队列线程技术?

标签 c# windows multithreading windows-services queue

我想实现一个 Windows 服务,该服务将丢弃的平面分隔文件捕获到一个文件夹中,以便导入到数据库中。我最初设想的是让 FileSystemWatcher 查看导入的新文件并创建一个新的导入线程。

我想知道我应该如何正确地为此实现一个算法以及我应该使用什么技术?我的方向是否正确?

最佳答案

我为客户开发了这样的产品。该服务正在监控多个文件夹中的新文件,当发现文件时,文件会被读取、处理(在条码打印机上打印)、存档和删除。

我们使用了一个“发现者”层,它使用 FileSystemWatcher 或根据环境进行轮询来发现文件(因为 FileSystemWatcher 在监控例如 samba 共享时不可靠)、一个“文件读取器”层和一个“处理器”层。

“发现者”层发现文件并将文件名放入“文件阅读器”层处理的列表中。 “发现者”层通过设置“文件阅读器”层正在等待的事件来表示有新文件要处理。

然后“文件读取器”层读取文件(使用重试功能,因为您可能会在创建文件的进程完全写入文件之前收到新文件的通知)。

“文件读取器”层读取文件后,使用 ThreadPool.QueueWorkItem 创建一个新的“处理器”线程来处理文件内容。

当文件被处理后,原始文件被复制到一个存档中并从原始位置删除。存档也定期清理,以防止服务器泛滥。存档非常适合故障排除。

两年多来,它已经在许多不同环境的生产中使用,并被证明非常可靠。

关于c# - c# 中正确的队列线程技术?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3810166/

相关文章:

c# - 无法使用 Rhino Mocks 为内部类型创建 Mock 类

c# - 尝试使用 Entity Framework Code First 更新数据库

c++ - 如何在Qt5中的QToolButton上设置GIF图像

c++ - POSIX线程体验? (或者推荐更好的)

c++ - 在嵌入式 Linux 中调度文件操作

java - 正确调用 Hashmap 的 get() 和 put() 方法。

javascript - 为什么我对 web.api 的请求被长时间运行的 Controller 代码阻止?

c# - session 状态未在页面之间保存

windows - 从Git Bash(MINGW64)运行MSVC 'cl.exe'

windows - 如何在 Windows 中为 Apache Tomcat 配置 xuggle