gpt4 book ai didi

.net - GC中断和TPL

转载 作者:行者123 更新时间:2023-12-04 04:26:31 26 4
gpt4 key购买 nike

我有WCF服务。在服务工作期间,它需要调用两个Web服务。因此,有类似以下代码:

var task1 = Task.Factory.StartNew(() => _service1.Run(query));
var task2 = Task.Factory.StartNew(() => _service2.Run(query));
Task.WaitAll(new[] { task1 , task2 });

在大多数情况下,这可以正常工作,但是偶尔我会看到执行时间激增,其中第一个任务花了几秒钟才开始。看着perfmon,我意识到这正是发生GC的时间。显然,与运行我的任务相比,GC具有更高的优先级。这是 Not Acceptable ,因为延迟对我来说非常重要,并且我希望GC在请求之间而不是在请求中间发生。

我尝试以另一种方式进行此操作,并且我没有使用自己的任务,而是使用了 WebClient.DownloadStringTask
return webClient.DownloadStringTask(urlWithParmeters).ContinueWith(t => ProcessResponse(clientQuery, t.Result),
TaskContinuationOptions.ExecuteSynchronously);

这没有帮助;现在,GC在任务开始之后但在继续之前运行。同样,我猜它认为系统现在处于空闲状态,因此现在是开始GC的好时机。只是,我承受不起等待时间。

使用TaskCreationOptions.LongRunning可以使调度程序使用非线程池线程,似乎可以解决此问题,但是我不想创建太多新线程-该代码将运行很多次(每个请求多次)。

解决此问题的最佳方法是什么?

最佳答案

首先让我清除此页面上出现的一些误解:

空闲时

  • GC不会发生。由于分配失败(新),GC.Collect或操作系统内存压力
  • 而触发时,会发生这种情况
  • GC可以停止应用程序线程。它不会同时运行(至少一定时间)
  • “GC中的%时间”是一个不会在GC之间更改的计数器,这意味着您可能会看到一个过时的值
  • 异步代码无法解决GC问题。实际上,它会生成更多垃圾(任务,IAsyncResult以及其他一些东西)
  • 在专用线程上运行代码不会阻止它们停止运行

  • 如何解决这个问题?
  • 产生更少的垃圾。附加一个内存事件探查器(JetBrains易于使用),查看产生垃圾的内容以及堆中的内容
  • 减小堆大小以减少暂停时间(3GB的堆可能是由于某些缓存?也许会缩小缓存?)
  • 使用同一个应用程序启动多个ASP.NET站点,挂接GC通知以感知GC的到来,并使某些IIS站点在具有GC(http://blogs.msdn.com/b/jclauzel/archive/2009/12/10/gc-notifications-asp-net-server-workloads.aspx?Redirected=true)时脱离负载平衡循环

    您会注意到没有简单的解决方法。我不知道,但是如果问题是由GC引起的,上述问题之一将解决问题。

  • 关于.net - GC中断和TPL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11518405/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com