带有 FileSystemWatcher 和 Timer 的 Windows 服务 - 确保所有内容都得到处理

2023-12-14

我创建了一个 C# Windows 服务应用程序来启动FileSystemWatcher监视目录中文件的创建。找到文件后,我实例化一个自定义类,该类解析文件 (CSV) 并使用其内容调用 Web 服务。该服务在某种程度上是异步的,并返回一个唯一的编号,必须使用该编号进行后续调用以检查其进度。在我的流程类中,我创建了一个计时器来不断检查作业是否完成。我是disposeing and close当我完成它时,我会调用我的计时器,但我只是想确保我的类将被垃圾收集,并且我不会有任何内存泄漏。

代码如下所示(为简洁起见,进行了删减):

我的主要服务类别:

    protected override void OnStart(string[] args)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = "path";
        watcher.Filter = "file";
        watcher.Created += new FileSystemEventHandler(watcher_Created);
        watcher.EnableRaisingEvents = true;
    }

    static void watcher_Created(object sender, FileSystemEventArgs e)
    {
        FileProcessor p = new FileProcessor();
        p.Process(e.FullPath);

        //Will this instance of p stick around until the timer within it is finished?
    }

文件处理器.cs

    class FileProcessor
    {
        private System.Timers.Timer timer = new System.Timers.Timer();
        private string id;

        public FileProcessor()
        {
            timer.Elapsed += new ElapsedEventHandler(OnTimer);
            timer.Enabled = false;
            timer.AutoReset = true;
        }

        public void Process(string filename)
        {
            //Read file <snipped>

            //Call web service and get id
            id = CallWebService();

            //Create a timer for 10 seconds and start it
            timer.Interval = 10000;
            timer.Enabled = true;
        }


        private bool IsFinished(string id)
        {
            //Call web service to see if job is finished, true if finished
            //<snipped>
        }


        private void ProcessResults()
        {
            //Job is finished, process results

            //Call cleanup method to dispose of timer
            Cleanup();
        }

        private void OnTimer(object source, ElapsedEventArgs e)
        {
            if (!IsFinished(id))
            {
                //Keep timer running, check result again next timer event
                return;
            }
            else
            {
                //Stop timer
                timer.Stop();

                //Process Results
                ProcessResults(response);
            }
        }


        private void Cleanup()
        {
            timer.Close();
            timer.Dispose();
        }
    }

我的问题是我的“p”实例是否应该保留(而不是被GC)直到我的计时器被销毁?它会被摧毁吗?我的 FileProcessor 类是否需要实现 IDisposable 以便我可以将其包装在 using 块中?我并不担心这是单线程的,因为我只希望它每天处理一个文件,并且该过程完成并返回以监视要创建的下一个文件的时间不应超过 10 分钟。


你走在正确的轨道上。文件系统观察者实施成分类,这要求您在使用后将其丢弃。既然是这种情况,正确的做法是让您文件处理器按照您的建议,类实现 IDisposable 。

既然你将拥有文件处理器对象长时间存在,您将无法使用using陈述。这是因为该对象会在完成其工作之前尝试被处置。

既然如此,我将在文件处理器处理完成时通知消费者。当这完成后,我会打电话给Dispose方法上的文件处理器目的。这Dispose方法应该执行该对象所需的所有清理 - IE:计时器、观察器等。

供你参考,这是一篇好文章其中列出了何时以及如何使用 IDisposable 接口的一些准则。另外,作为一个好的实践,您将希望将消费者中的调用包装在 try/catch 块中 - 您需要确保无论发生什么情况,您都会尝试释放资源。

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

带有 FileSystemWatcher 和 Timer 的 Windows 服务 - 确保所有内容都得到处理 的相关文章

  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 解析 JWT 令牌以仅获取有效负载内容,无需 C# 或 Blazor 中的外部库

    我正在使用 Blazor 编写可以访问 JWT 的客户端应用程序 我想知道一种简单的方法来读取令牌有效负载内容而不添加额外的依赖项 因为我不需要其他信息 也不需要验证令牌 我认为解析有效负载内容应该足够简单 只需将其写入方法即可 JwtTo
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • 将接口转换为其具体实现对象,反之亦然?

    在 C 中 当我有一个接口和几个具体实现时 我可以将接口强制转换为具体类型 还是将具体类型强制转换为接口 这种情况下的规则是什么 Java 和 C 中都允许这两个方向 向下转型需要显式转型 如果对象类型不正确 可能会抛出异常 然而 向上转换
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 如何使用 NPOI 按地址(A1、A2)获取 Excel 单元格值

    我有一个 Excel 单元格地址 例如 A1 A2 如何使用 C 中的 NPOI 框架以编程方式访问此单元格 我找到的一些 Java POI 示例代码 CellReference cr new CellReference A1 row my
  • Project Euler #8,我不明白我哪里出了问题[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我正在做项目欧拉第八题 https projecteuler net problem 8 其中我得到了这个大得离谱的数字 7316
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 在 C#.NET 中安全删除文件

    在我正在做的一个项目中 我想为用户提供 安全 删除文件的选项 例如 用随机位或 0 覆盖它 在 C NET 中是否有一种简单的方法可以做到这一点 效果如何 你可以调用系统内部删除 http technet microsoft com en
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl
  • 为什么匹配模板类上的部分类模板特化与没有模板匹配的另一个部分特化不明确?

    这个问题可能很难用标题中的句子来描述 但这里有一个最小的例子 include

随机推荐

  • 如何在 bash 中创建仅包含十六进制字符而没有空格的文件的十六进制转储?

    我如何创建一个未修改的Linux 中使用 bash 的二进制文件的十六进制转储 这od and hexdump命令都在转储中插入空格 这并不理想 有没有一种方法可以简单地在输出中编写一个包含所有十六进制字符 减去空格或换行符的长字符串 xx
  • 为什么我的字符串开头有“未定义”文本?

    我有一个函数可以将 AJAX 请求的结果连接在一起 由于某种原因 我的最终字符串以 未定义 开头 这是重现该问题的简化示例 In practice fetched via AJAX from a server var vendors id
  • ASP.NET MVC 本地化

    我正在尝试通过路线实现本地化 我有以下内容 routes MapRoute DefaultLocalized lang controller action id new controller Home action Index id lan
  • 使用 mysql 中的递归 php 创建数组

    我需要从像这样组织的 mysql 数据库创建一个数组 id description parentId 1 Level 1 0 2 Level 2 0 3 Level 1a 1 4 Level 1b 1 5 Level 1a1 3 6 Lev
  • jQuery 动画背景位置在块中?

    我正在尝试使用 jQuery 使跨度的背景位置每秒下降 10 像素 有什么好的方法可以做到这一点 我一直在玩 jQuery animate delay CSS 等setTimeout功能 但我无法让任何东西工作 非常感谢建议 我试图使 y
  • gitlab-shell:不允许的命令

    我已经在 Ubuntu 14 04 上安装了最新版本的 GitLab 除了推送到远程之外它工作正常 Running ssh email protected git receive pack repo git 效果很好 在 gitlab sh
  • ASP.NET MVC5 占位符中的字体很棒

    我正在尝试向登录页面的占位符添加一个字体很棒的图标 这是我到目前为止所拥有的 我不知道如何获得字体很棒的图标inside文本框 作为占位符 Html TextBoxFor m gt m UserName new class form con
  • XElement.Load 读取 & 符号和特殊国家/地区字符时出错

    我在从 XML 文件读取 符号时遇到问题 XElement xmlElements XElement Load Path Xml Data File 当我有以下情况时 我会收到错误
  • 在下拉列表打开时更改其内容?

    我有一个包含一些项目的下拉列表 当用户选择其中之一时 我希望下拉列表保持打开状态并重新填充新项目 然后用户选择其中之一 最后下拉菜单关闭 可以用 JavaScript 完成吗 如果是这样 怎么办 为了科学 我创建了一个替代答案来测试这一点
  • 如何在xmppGroupCoreDataStorageObject中保存和获取?

    Using xmpp messenger ios 我已经创建了组并设置了其配置并将用户添加到其中 然后我想将该组添加到xmppGroupCoreDataStorageObject存储以将其列出到 OpenChatViewController
  • UITextField 边框颜色

    我非常希望将自己的颜色设置为 UITextField 边框 但到目前为止我只能找到如何更改边框线样式 我使用背景属性以这种方式设置背景颜色 self textField backgroundColor textFieldColor 但我也必
  • pip/python:普通站点包不可写

    我有一台新 Macbook 一个用户安装了它 然后我安装了一个新用户 我的 授予管理员权限并删除了旧用户 我在 Catalina 操作系统上 自从安装以来 我一直遇到一些权限问题 VSCode 找不到 Jupyter Notebook pi
  • 获取 Google Cloud Storage 中的文件列表 (Appengine PHP)

    我有一个 Google Cloud Storage 存储桶 MyBucket 它有 20 个项目 我想在我的 appengine PHP 应用程序中获取这些文件名 我正在考虑是否可以使用 App Engine 的内置 Google Clou
  • 正则表达式帮助 - python - 从 css 中提取所有图像 url

    我正在尝试从 css 文件中提取所有图像 jpg png gif uri 示例 CSS blockpricecont width 660px height 75px background url images postBack jpg re
  • 使用画布nodeJS模糊图像

    这好像是ctx filter blur amount 不起作用 这是我的代码 const body await request get url const data await Canvas loadImage body ctx filte
  • 在c#中通过位掩码存储多个值

    我试图通过位掩码将四个独立的 5 位值 0 31 存储在 32 位 int 内 但无法正确设置这些值 并从用于存储的掩码 int 中获取各个值 谁能帮我这个 Edit 抱歉外部链接 这里有一些 JavaScript 演示了我想要实现的目标
  • 如何在 ASP.NET Core 6 中将字段值从 true 切换为 false,反之亦然

    我正在使用 ASP NET Core 6 和 mongodb 作为数据库构建一个 API 我正在尝试设置某个字段以从 true 切换到 false 反之亦然 如果场isactive True 然后我必须将其更新为 false 反之亦然 我已
  • 解析apache日志文件

    我刚刚开始学习 Python 想读取 Apache 日志文件并将每行的部分内容放入不同的列表中 文件中的行 172 16 0 3 25 Sep 2002 14 04 19 0200 GET HTTP 1 1 401 Mozilla 5 0
  • Cassandra:插入 timeuuid 错误

    我有下表 create table test userId varchar notifId timeuuid notification varchar time bigint read boolean primary key userId
  • 带有 FileSystemWatcher 和 Timer 的 Windows 服务 - 确保所有内容都得到处理

    我创建了一个 C Windows 服务应用程序来启动FileSystemWatcher监视目录中文件的创建 找到文件后 我实例化一个自定义类 该类解析文件 CSV 并使用其内容调用 Web 服务 该服务在某种程度上是异步的 并返回一个唯一的