Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET中ThreadStart_上下文中的奇怪延迟导致性能问题_C#_.net_Performance_Dottrace - Fatal编程技术网

C# NET中ThreadStart_上下文中的奇怪延迟导致性能问题

C# NET中ThreadStart_上下文中的奇怪延迟导致性能问题,c#,.net,performance,dottrace,C#,.net,Performance,Dottrace,我编写了一个相对简单的控制台实用程序,用于访问ClosedXML库,以生成Excel电子表格。没什么好激动的,它应该跑得很快。但是,当我启动它时,它会在控制台屏幕上停留约8秒钟,然后再显示任何进度 起初,我认为这是ClosedXML库,需要一些时间来初始化。我启动了dotTrace并逐行进行性能分析,得到了一些奇怪的结果: 主螺纹[14352MS] 干管[99.29%-14251ms] 生成[88.88%-12756ms] 11个列出的通话总计为23.44%/4360毫秒 获取_实例[

我编写了一个相对简单的控制台实用程序,用于访问ClosedXML库,以生成Excel电子表格。没什么好激动的,它应该跑得很快。但是,当我启动它时,它会在控制台屏幕上停留约8秒钟,然后再显示任何进度

起初,我认为这是ClosedXML库,需要一些时间来初始化。我启动了dotTrace并逐行进行性能分析,得到了一些奇怪的结果:

  • 主螺纹[14352MS]
    • 干管[99.29%-14251ms]
      • 生成[88.88%-12756ms]
        • 11个列出的通话总计为23.44%/4360毫秒
      • 获取_实例[6.78%-974ms]
      • Console.ReadLine[2.75%-394ms]
      • 解析策略[0.82%-118ms]
      • 11个隐藏函数[0.01%-1ms]
    • 解决策略[0.20%-29毫秒]
    • 7个列出的通话总计为0.51%/72ms
  • 线程“.NET SystemEvents”[3074ms]
    • 螺纹起点[100%-3074ms]
      • 运行[99.6%-3072ms]
        • ThreadStart_上下文[99.93%-3072ms]
现在,如果我们深入研究
ThreadStart\u上下文
,我们会看到以下内容:

  • System.Threading.ThreadHelper.ThreadStart_上下文(对象)[99.93%-3072ms]
    • Microsoft.Win32.SystemEvents.WindowThreadProc[99.90%-3071ms]
      • Microsoft.Win32.UnsafentiveMethods.MsgWaitForMultipleObjectsEx[87.26%-2682ms]
据分析器称,
MsgWaitForMultipleObjectsEx
API总共被调用了26次。这意味着每次等待大约100毫秒

Generate
方法是我编写的,它与ClosedXML库有很多联系。操作的一部分涉及写入磁盘,但这是在控制台输出出现后的最后完成的。延迟发生在任何工作完成之前

我的关注有两方面:

  • 为什么主线程上的
    Generate
    调用下的结果存在8396ms的时间差异
  • 为什么有这么多调用
    MsgWaitForMultipleObjectsEx
    ,总共需要3秒钟?我知道这可能是由于线程同步,但应用程序中只有一个线程
  • 更新:好的,所以我发现第二个线程实际上正在处理消息循环,所以在那里花费的5秒钟只是没有任何窗口消息要处理的区域。不过,我仍然不确定8秒的差异是从哪里来的