RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 591163
Accepted
tCode
tCode
Asked:2020-11-15 17:25:32 +0000 UTC2020-11-15 17:25:32 +0000 UTC 2020-11-15 17:25:32 +0000 UTC

C#。窗口服务。内存泄漏

  • 772

请告诉我我在哪里犯了错误,该服务正在逐渐消耗内存

该服务在启动时的任务是逐行加载 Services.txt 文件中的地址,List<Uri>并在一定时间间隔后对文件中的每个 URL 发出 GET 请求

程序.cs

static class Program
{
    static void Main()
    {
        ServiceBase[] ServicesToRun = {
            new ServicePusher()
        };

        ServiceBase.Run(ServicesToRun);
    }
}

ServicePusher.cs

public partial class ServicePusher : ServiceBase
{
    private static readonly Logger Log = LogManager.GetCurrentClassLogger();
    private Timer ServiceTimer;
    private readonly List<Uri> ServiceUrl = new List<Uri>();

    public ServicePusher()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "/Services.txt"))
        {
            Log.Error("Не найден Services.txt");
            throw new FileNotFoundException("Не найден Services.txt");
        }

        using (StreamReader sr = new StreamReader(AppDomain.CurrentDomain.BaseDirectory + "/Services.txt"))
        {
            string line;

            while ((line = sr.ReadLine()) != null)
            {
                Uri serviceUri = null;

                try
                {
                    serviceUri = new Uri(line);
                }
                catch (Exception ex)
                {
                    Log.Error($"Ошибка при получении адреса сервиса ({line}): {ex}");
                }

                if (serviceUri != null)
                {
                    ServiceUrl.Add(serviceUri);
                }
                else
                {
                    Log.Error($"Некорректный адрес сервиса ({line}) в файле Services.txt");
                }
            }
        }

        ServiceTimer = new Timer
        {
            Interval = Config.Interval
        };

        ServiceTimer.Elapsed += Tick;
        ServiceTimer.AutoReset = true;
        ServiceTimer.Start();


        Log.Info("Сервис успешно запущен");
        Log.Info($"Загружено сервисов: {ServiceUrl.Count}");
    }

    protected override void OnStop()
    {
        ServiceTimer.Stop();
        ServiceTimer.Dispose();
        ServiceTimer = null;

        Log.Info("Сервис остановлен");
    }

    private void Tick(object sender, ElapsedEventArgs e)
    {
        try
        {
            foreach (Uri url in ServiceUrl)
            {
                ServicePointManager.ServerCertificateValidationCallback = (o, a, b, c) => true;

                WebRequest request = WebRequest.Create(url);
                request.Proxy = null;
                request.Method = "GET";
                request.Timeout = 360000;
                request.ContentType = "application/x-www-form-urlencoded";

                try
                {
                    using (WebResponse response = request.GetResponse())
                    {
                        using (Stream requestStream = response.GetResponseStream())
                        {
                            if (requestStream == null)
                            {
                                Log.Error($"Нет ответа от {url}");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Log.Error($"Ошибка ({ex.Message}) при запросе к сервису {url}");
                }
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex.Message);
        }
    }
}

UPD:每小时消耗约 2 MB

UPD 2:更新问题中的代码,15分钟稳吃~350 kb ...

也许它在Program.cs中?

c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    tCode
    2020-11-16T15:28:14Z2020-11-16T15:28:14Z

    总的来说,我的担心是徒劳的,我让服务运行了一整夜,现在它可以运行并且只使用 5 MB 内存

    但尚不清楚为什么在启动该服务时,它第一次消耗大约 11 MB。

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5