c# - Windows 服务内存使用量增加

原文 标签 c# multithreading memory-leaks timer windows-services

我有一个 Windows 服务做 3 个预定的工作。首先是向员工发送电子邮件,了解他们的轮类时间。第二个是获取 Active Directory 信息并将其保存到本地数据库。最后一个是将事件目录照片保存到文件目录。

每项工作都在一个单独的线程上完成。计时器每 45 秒滴答一次。除了服务的内存使用量稳步增加外,一切都运行良好。

你知道是什么原因造成的吗?

Thread[] thread;

protected override void OnStart(string[] args)
{
    timer = new System.Timers.Timer();
    timer.AutoReset = true;
    timer.Enabled = true;
    timer.Interval = 1000 * 45;
    timer.Start();
    timer.Elapsed += Timer_Elapsed;
    servisList = new List<IService>() { new ShiftNotification(), new     ActiveDirectoryService(), new DirectoryPhotos() };
    thread = new Thread[servisList.Count];
}

private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    try
    {
        for (int i = 0; i < servisList.Count; i++)
        {
            if (thread[i] == null)
            {
                if (TimeControl.CheckTime(DateTime.Now, servisList.ElementAt(i).sProps))
                {
                    thread[i] = new System.Threading.Thread(new System.Threading.ThreadStart(servisList.ElementAt(i).NotifyUsers));
                    thread[i].Start();
                }
            }
            else
            {
                if (thread[i].ThreadState != System.Threading.ThreadState.Running)
                {
                    if (TimeControl.CheckTime(DateTime.Now, servisList.ElementAt(i).sProps))
                    {
                        thread[i] = new System.Threading.Thread(new System.Threading.ThreadStart(servisList.ElementAt(i).NotifyUsers));
                        thread[i].Start();
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
    }
}

最佳答案

只是一些想法

  • 两者 ActiveDirectorySmcpClient (如果您不将它用于电子邮件,请纠正我)使用意味着您正在处理非托管资源,您是否正确处理了这些类?您可能应该将客户端变量设为静态字段并在程序结束时处理它们。
  • 这些行对我来说不清楚:
    if (thread[i].ThreadState != System.Threading.ThreadState.Running)
    {
        if (TimeControl.CheckTime(DateTime.Now, servisList.ElementAt(i).sProps))
        {
            thread[i] = new System.Threading.Thread(new System.Threading.ThreadStart(servisList.ElementAt(i).NotifyUsers));
            thread[i].Start();
        }
    }
    
    Thread也是非托管资源,因此,因为它正在实现 IDisposable ,您应该在为数组条目分配新值之前处理前一个:thread[i].Dispose();
  • 次要为什么你已经添加了全名using System.Threading ?
  • 关于c# - Windows 服务内存使用量增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41576401/

    相关文章:

    java - 如何监视ProcessBuilder运行的外部流程?

    c++ - 如何使用 `std::async`在互斥锁保护的循环中调用函数?

    objective-c - 跟踪所有 Objective-C 的 alloc/allocWithZone/dealloc

    android - MapView 保持 Context 导致内存泄漏

    c# - 请求类型为'System.Data.Odbc.OdbcPermission ..的权限。需要帮助

    c# - 在 C# 项目中使用 C++ API

    javascript - 使用 ASP.net 身份在基于 Angular 色的授权的 MVC View 中禁用输入字段

    javascript - 退出时发送电子邮件

    java - 创建Thread对象或实际启动线程是否昂贵?

    linux - 到目前为止,Linux内核内存泄漏已修复