我的性能问题是WCF还是网络相关?

时间:2014-09-24 17:58:07

标签: c# multithreading performance wcf visual-foxpro

我有一个程序从视觉foxpro表中检索数千行数据,然后将其显示给用户。然后,用户可以根据需要选择尽可能多的检查,并将相反的金额写入10个不同的foxpro表。

根据用户选择的信息,我为每个选择创建一条记录,并使用WCF将其写入表中。

下面是我用来回写表格的一段代码:

Task head = new TaskFactory().StartNew(() =>
       {

           CreateVoidHistHead(curChecks, i);
           //pass in _i which is defined within this routine.  Cannot have _i global.

           CreateApHead(curChecks, i);


           var checkRecAdjustment = CreateAdjustmentRec(curChecks, ckdate);
           var checkRecVoidChks = CreateVoidChksRec(curChecks);
           var checkGjAdj = CreateGjAdj(curChecks);
           var checkApSnpSht = CreateApsnpRec(curChecks);

           using (var coatsService = factory.CreateCoatsService())
           { 
               coatsService.InsertPrsnapc(_path, checkRecAdjustment);
               coatsService.InsertVoidchk(_path, checkRecVoidChks);
               coatsService.InsertGjadj(_path, checkGjAdj);
               coatsService.InsertApsnpsht(_path, checkApSnpSht);
           }
       });

正如您在上面的代码中看到的,我正在创建一个处理此调用的任务。我总共创造了3个任务。第一个任务是插入一个表,上面的任务是插入6个表,最后一个任务是插入3个表(所有表都使用与上面类似的逻辑)。

这是我遇到的速度问题。当我选择10 checks时,写入这些表的平均时间为10 seconds。如果我选择20 checks,则平均时间为25 seconds50 checks = 1分钟,100 checks10+ minutes。我甚至把它分解为每个选定的项目级别。使用10 checks选择的每个项目的平均值为1.48sec 20 checks2.6sec50 checks6.8 seconds,其中任何内容均为12 seconds per check但程序会停止几分钟,然后再次开始插入并停止并继续等,直到插入所有检查。 (每次检查的秒数基于秒表类,我将此写入调试窗口。我没有花费总时间除以检查次数。)

我尝试了3种不同的场景:

  1. 我使用上面所述的所有插件创建了3个任务。我选择了100个支票,我有一个后台计时器,可以检查所有任务的状态(在这种情况下为300),它会告诉我任务何时完成。这花了十多分钟。

  2. 我使用上面所述的所有插件创建了3个任务。我选择了100个支票,等待所有任务完成后再进行下一次检查。这也花了十多分钟。

  3. 我选择了100个支票,但我没有运行任何任务。我只是使用主线程将信息写回表中。它与上面任务中的代码相同,减去任务。写入所有表格的时间超过10分钟。

  4. 正如你所看到的,无论我是否有任务和后台计时器,任务并且等待所有任务或没有任务,我都没有经历任何速度提升。

    其他信息 - 我已将我的应用配置更改为 maxconnections = 300 listenbacklog = 300 。我不确定这是否会影响我正在做的事情,但我想我会把它扔出去。

    问题:

    1. 有人可以解释为什么插入的每张支票的平均时间会根据所选的支票数量而变化吗?在我看来,我相信如果我选择10张支票或100张支票,则每张支票应该更加一致,而对于10组而言不是1.48sec,而对于100组则不是12 seconds

      < / LI>
    2. 写入15次检查是间歇性的,然后停止1到3分钟,然后继续处理,停止等等,为什么当我查看输出窗口时,我看到线程& #39;&#39;退出代码259?我看了Why am I seeing multiple "The thread 0x22c8 has exited with code 259 (0x103)." messages,我无法真正解决问题。当我单击该问题的解决方案中的链接时,它将带我到一个微软论坛,该论坛说明该问题已在Visual Studio的未来版本中得到修复。

    3. 这可能是一个网络问题吗?由于我试图通过WCF处理100个插入内容,可能是我性能问题的原因?

    4. 非常感谢任何有关如何解决此性能问题的正确方向的帮助,无论是网络还是WCF相关。如果需要其他信息,请告诉我,我会更新机票。

1 个答案:

答案 0 :(得分:1)

我的问题的答案都是。

我建议使用分析器(感谢您使用建议)来查看瓶颈的位置。

我的公司遇到了网络挑战,导致整个网络速度变慢,但如果有其他人遇到此问题,请确保您正在处理每个连接。

我的主要问题是我正在创建100个--1000个连接而不是围绕它们使用...我做了一个更改并将所有连接包含在一个使用中,并且中提问题得到了解决。现在,我在50次检查和100次检查之间获得了类似的性能,达到350次检查。

对于那些不知道如何使用的人,请转到:

C#

    using (var coatsService = _factory.CreateCoatsService())
    {
        var cls = coatsService.GetPrdedtxts(_path);
        return cls.ToList();
    }

VB

    Using coatsService = _factory.CreateCoatsService()
        Dim cls = coatsService.GetPrdedtxts(_path)
        return cls.ToList()
    End Using