发送电子邮件时内存泄漏

发布于 2024-08-19 05:34:49 字数 305 浏览 5 评论 0原文

我有一个 Windows 服务,它被配置为按预定义的时间表发送电子邮件。该计划与 System.Timers.Timer 配合使用,每次引发 Timer_Elapsed 时,我都会调用 Timer.Stop(),发送电子邮件(每次约 1500 封电子邮件),计算下一个刻度的时间量并启动计时器(调用 Timer.Start() 方法)。 问题是,当计时器结束并且进程开始发送电子邮件时,使用的内存会增加,但完成后不会减少。当我在“不定时”应用程序中调用该函数时,所使用的内存在完成发送过程后将被释放。 谁能帮助我理解为什么会发生这种情况?也许与计时器中使用的线程有关?

提前致谢。

I have a windows service, which is configured to send emails in a predefined schedule. The schedule works with System.Timers.Timer and every time the Timer_Elapsed is raised I call Timer.Stop(), send emails (each time about 1500 emails), calculate the amount of time the next tick will be raised and start the timer (calling Timer.Start() method).
The problem is when the timer is elapsed and the process started sending emails, the memory in use increases but not decreases after finishing. When I call the function in a "not timered" application, the used memory is freed up after finishing sending process.
Can anybody help me to understand why this is going on? Maybe there's something concerning to threads used in timer?

Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绅刃 2024-08-26 05:34:49

这里有一些明显的可能性。

  1. 垃圾收集尚未启动,并且没有内存泄漏。随着时间的推移进行监控,了解内存使用情况的动态情况,并查看其是否达到峰值并稳定下来。

  2. 您没有使用库的关闭或刷新函数

  3. 您的计时器正在启动一个永远不会终止的线程。使用进程监视器并观察线程计数很容易看到这一点。

内存泄漏虽然并非不可能,但在 .net 语言中是不可能发生的。您不是直接访问或控制内存。由于 JIT 会进行内存分配并清除所有内容,因此您真正需要检查的是代码中未释放的内容。

如果没有具体细节,我无法提供更好的帮助,特别是不知道您是否正在执行文件 IO 等。

There are a few blatent possibilities here.

  1. Garbage collection has not kicked in and there is no memory leak. Monitor over time to see how dynamic the memory usage is and see if it peaks and settles.

  2. You are not using close or flush functions of the library

  3. Your timer is starting a thread which never terminates. This is easy to see using a process monitor and watching the thread counts.

Memory leaks, while not impossible by any means, are improbable in .net languages. You are not directly accessing or controlling memory. Since the JIT does the memory allocation and clearing all you really need to check for is things not being freed in code.

Without specifics I cant give better help, especially not knowing if you are doing file IO etc.

一个人的旅程 2024-08-26 05:34:49

您必须关闭 SMTPClient 对象连接以防止内存泄漏。

SmtpClient 客户端 = new SmtpClient("SMTPServerAddress");
...
客户端.发送(消息);
client.ServicePoint.CloseConnectionGroup(client.ServicePoint.ConnectionName);

You must close SMTPClient object connection to prevent memory leaks.

SmtpClient client = new SmtpClient("SMTPServerAddress");
...
client.Send(message);
client.ServicePoint.CloseConnectionGroup(client.ServicePoint.ConnectionName);

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文