简单的 C# WinForm 应用程序显示在 Visual Studio 中有 3 个线程。任务管理器显示 14-16 个线程。为啥?

Posted

技术标签:

【中文标题】简单的 C# WinForm 应用程序显示在 Visual Studio 中有 3 个线程。任务管理器显示 14-16 个线程。为啥?【英文标题】:Simple C# WinForm app shows to have 3 threads in visual studio. Task Manger show 14-16 threads. Why?简单的 C# WinForm 应用程序显示在 Visual Studio 中有 3 个线程。任务管理器显示 14-16 个线程。为什么? 【发布时间】:2019-01-30 03:23:35 【问题描述】:

我正在用 C# 创建一个非常简单的 WinForm 应用程序。除了形式之外什么都没有。没有其他代码。当我点击暂停并查看 Visual Studio 中的线程窗口时,我看到了 3 个线程。 1 个主线程和 2 个工作线程(用于可能是 GC 或 JIT)

当我在应用程序运行时打开任务管理器时,我看到应用程序有 14-16 个线程。我不明白是什么在创建这些其他线程。谁能帮忙?

【问题讨论】:

一个不退出的表单有一个块。主要在 Program.cs 中,它调用主要的表单构造函数。主窗体继承了包含块的窗体。它还启动一个后台进程,该进程管理诸如单击事件之类的事件。所以你有 1) 主类 2) 表单类 3) 事件处理程序。 能否请您将您的任务管理器截屏并附在此处?我检查了一下,它只有 1 个线程。 这感觉像是一个 XY 问题 - meta.stackexchange.com/questions/66377/what-is-the-xy-problem。你为什么在乎?您的根本问题是什么? 托管线程和操作系统线程之间没有一对一的映射关系,对于需要分析应用程序的开发人员来说,任务管理器并不是一个理想的工具。我选择相信 Visual Studio。 添加截图。我喜欢@lesscode 的答案,我会以这种方式进行调查。 【参考方案1】:

在 WinForms 应用程序中可能由于多种原因而存在额外的工作线程,包括:

线程池线程被短暂使用并正在等待额外的工作(如果没有发生任何事情,线程池最终会杀死它们) GDI+/DDE 通常会创建一个后台线程 CLR 终结器线程

您看到的大多数线程很可能是第一种。

提示:如果您想在 Visual Studio 调试器的“线程”面板中查看这些线程,请确保您的项目已配置为“启用本机代码调试”(在“项目设置”的“调试”选项卡下)。

【讨论】:

以上是关于简单的 C# WinForm 应用程序显示在 Visual Studio 中有 3 个线程。任务管理器显示 14-16 个线程。为啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# winform程序,怎么实现菜单的功能

C# .net4.5 winform程序 怎么在没有net环境运行?

C#中 winform程序 怎么制作纵向选项卡

在C# winform 程序里设置 DataGrid 为只读属性。

C# .net4.5 winform程序 怎么在没有net环境运行?

c#的winform程序中,radiobutton的用法