【问题标题】:.NET How to keep a Threading.Task alive with a While Loop.NET 如何使用 While 循环保持 Threading.Task 活动
【发布时间】:2016-06-28 16:15:29
【问题描述】:

我以前没有使用过 Windows 的 DebugDiag 的经验,需要对这份报告有所了解。

我的 EWS 托管 API 应用程序每次发生事件时都会跨越一个新任务。

我的应用程序以大约 30-35% 的 CPU 使用率运行,因此我决定运行此诊断工具来找出原因和原因。

我知道了,需要确保我看到的和我想的一样。

从下图来看,Task.StartNew函数被执行了5次,导致CPU占用这么高?

更新

深入研究后,我发现似乎是“Stacktrace”,其中一些函数调用以红色突出显示,我有一种感觉,红色意味着这些函数导致高 CPU,这些函数似乎来自 EWS 托管 API 代码。

【问题讨论】:

  • 调用堆栈的顶部是一个同步数据的 Exchange 任务。因此可以预期高 CPU 使用率,并将在数据同步完成时结束。如果您知道如何使用 ILSpy 等工具,则可以反编译相关方法以获得更多见解。

标签: .net multithreading infinite-loop cancellationtokensource


【解决方案1】:

我发现 CPU 吃掉了一段代码。

我在 Tast 中有一个无限的 while 循环,因为我需要防止它被垃圾收集。

        While Not pToken.IsCancellationRequested
            If pToken.IsCancellationRequested Then Return
        End While

这导致我的 CPU 使用率一直高达 38%!

所以我改用了

        _CancelSignal = New AutoResetEvent(False)

        _CancelSignal.WaitOne()

通过设置_CancelSignsal 让线程进入睡眠状态直到我告诉它退出

【讨论】:

  • 要重新创建您真正应该使用ManualResetEvent 的行为。自动事件将在允许一件事通过后自行重置,一旦要求取消,您的旧代码将允许不止一件事通过
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2017-12-04
  • 2022-01-22
相关资源
最近更新 更多