C# TopShelf 服务在调试时运行良好;令人难以置信的慢而不调试

C# TopShelf Service runs great with debugging; Incredibly slow without debugging

编辑:这仍然是一个问题,但程序作为一项服务并不 运行ning 慢,它 运行ning 在不调试时慢。 运行 没有调试的诊断产生了同样的缓慢。峰值 cpu 使用率为 3%。话虽这么说,任何关于为什么这个应用程序在没有调试的情况下会变慢 运行 的帮助都会非常有用,因为我 google 记下了答案:)

使用 C# 和 nuget'd topshelf,我制作了一个 filewatcher/mover。有一个 filesystemwatcher 实例,它针对文本文档(100 kb > 8 MB)执行一长串逻辑。当它读取此文本文档(在 UNC 网络位置上)时,它将行移动到 2 个输出文件之一。

虽然我 运行 通过 Visual Studios 2015 Community 的应用程序处于调试模式或发布模式,但所有文件操作和移动都是尽可能即时的。满意后,我将该应用程序作为服务安装在同一台本地计算机上。我打开服务,按下触发器,它开始移动文本文件....每几秒 50 kb。

1 MB 的文件需要几分钟来解析,而在 运行 到 Visual Studio 秒时需要花费高达 10 秒。该服务以我的身份登录,Visual Studio 中的同一用户。

有什么想法吗?我已经将 topshelf 用于 3-4 个其他服务,所有服务都使用 filesystemwatcher 或 System.IO.FILE 库(使用文件库)。

如果需要,我可以 post 一些代码,只是一堆 if 语句,因为它遍历每一行文本。关键问题是:在 VS 中工作得很好,而不是作为一项服务。为什么??

P.S。刚刚注意到将 1.4 MB 的内容逐行移动到另一个文件需要 >4 分钟,但在同一秒内完成移动后的所有逻辑。

我将 post 我正在使用的 topshelf 配置片段,因为它并不多:

    static void Main(string[] args)
    {
        HostFactory.Run(hostConfigurator =>
        {
            hostConfigurator.Service<Service>(serviceConfigurator =>
            {
                serviceConfigurator.ConstructUsing(name => new ASNWatcher());
                serviceConfigurator.WhenStarted(tc => tc.Start());
                serviceConfigurator.WhenStopped(tc => tc.Stop());
            });
            hostConfigurator.RunAsLocalSystem();

            hostConfigurator.SetDescription("HighRisk ASN Watcher");
            hostConfigurator.SetDisplayName("HighRiskASNWatcher");
            hostConfigurator.SetServiceName("HighRiskASNWatcher");
        });
    }

(是的,它说本地系统,我更改了它 post 安装到正确的用户。)

添加读取代码;非常简洁。

我正在添加执行拆分的代码片段:

     foreach (string line in File.ReadAllLines(fullPath))
            {
                if (line.StartsWith("ASIAUD"))
                {
                    foreach (var field in fileHelper856AUD.ReadString(line))
                    {
                        if (field.TradeID.TrimEnd() != TradeID && field.TradeID.TrimEnd() != CatalogTradeID)
                        {
                            logger.Info("Found thisTrade ID:  " + field.TradeID.TrimEnd());
                            thisorder = true;
                        }
                        else
                        {
                            logger.Info("Found thatTrade ID:  " + field.TradeID.TrimEnd());
                            thisorder = false;
                        }
                    }
                }
                if (thisorder )
                {
                    try
                    {

                        File.AppendAllText(newfile1, line + Environment.NewLine);
                    }
                    catch (Exception e)
                    {
                        //write to log,  also send an email alerting IT.
                    }
                }
                else
                {
                    File.AppendAllText(newfile2, line + Environment.NewLine);
                }
            }
            logger.Info("File Split Complete.  Deleting Original File...");
            File.Delete(fullPath);

一旦我发现不是服务部分在伤害它,只是 运行 它没有一般的分析器,我就能够找到一些提示并通过其他一些 Stack 文章找到正确的方向.

Why does my program run way faster when I enable profiling?

The reason is because when you run your application within Visual Studio, the debugger is attached to it. When you run it using the profiler, the debugger is not attached.

If you press F5 to run your program, even with the Release build, the debugger is still attached.

If you try running the .exe by itself, or running the program through the IDE with "Debug > Start Without Debugging" (or just press Ctrl+F5) the application should run as fast as it does with the profiler.