线程不活动时释放资源

2024-03-25

我正在使用BackgroundWorker,在其中我使用foreach循环,在其中创建新线程,等待它完成,然后报告进度并继续foreach循环。这就是我要说的:

private void DoWork(object sender, DoWorkEventArgs e) {
            var fileCounter = Convert.ToDecimal(fileNames.Count());
            decimal i = 0;
            foreach (var file in fileNames) {
                i++;
                var generator = new Generator(assembly);

                var thread = new Thread(new ThreadStart(
                        delegate() {
                            generator.Generate(file);
                        }));
                thread.SetApartmentState(ApartmentState.STA);
                thread.Start();
                while (thread.IsAlive); // critical point
                int progress = Convert.ToInt32(Math.Round(i / fileCounter * 100));
                backgroundWorker.ReportProgress(progress);
            }
        }

问题是线程完成后(通过“临界点”行后)内存没有被释放。我认为当线程不活动时,与其关联的所有资源都会被释放。但显然这不是真的。 谁能向我解释为什么以及我做错了什么。 谢谢。


您设法关闭了告诉您做错了什么的组件。然而你并没有真正解决问题。不支持线程的组件需要 STA(单线程单元)。这样它的所有方法都是从same线程,即使调用是在另一个线程上进行的。 COM 负责将调用从一个线程编组到另一个线程。 STA 线程通过泵送消息循环来实现这一点。

然而你所做的是创造another线程并对其进行调用,这与该线程所在的线程不同发电机对象被创建。这并不能解决问题,它仍然是线程不安全的。 COM 仍然封送调用。

重要的是您创建该线程的线程发电机目的。由于它是一个公寓线程对象,因此must在 STA 线程上创建。 Windows 应用程序中通常只有一个,即程序的主线程,通常称为 UI 线程。如果您在不是 STA 的 .NET 工作线程上创建它(就像您在此处所做的那样),那么 COM 将介入并创建一个 STA 线程本身,为组件提供一个好客的家。这很好,但通常是不可取的。

这里没有免费的午餐,你无法神奇地编写一段代码明确地说它不(注册表中的 ThreadingModel 键)支持线程行为。您的下一个最佳选择是创建一个 STA 线程并运行all其上的代码,包括 COM 对象的创建。请注意,您通常必须使用 Application.Run() 来泵送消息循环,许多 COM 服务器假设有一个可用的消息循环。特别是当他们告诉您需要 STA 线程时。您会注意到,当它们行为不当、方法调用陷入僵局或不引发事件时,它们就会这样做。

关于您最初的问题,这是标准的 .NET 行为。垃圾收集器在需要时运行,而不是在您认为应该运行时运行。您可以使用 GC.Collect() 覆盖它,但这很少是必要的。尽管在您的情况下这可能是一个快速修复方法,但 COM 会为每个文件创建一个新线程。 STA 线程给出发电机一个家。使用“调试”+“Windows”+“线程”来查看它们。这些线程在 COM 对象被销毁之前不会停止。这需要终结器线程才能运行。当文件超过 2000 时,您的代码还将消耗所有可用内存并引发 OOM,这也许足以寻找真正的修复方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程不活动时释放资源 的相关文章

  • 类型转换 sockaddr 结构

    我正在尝试学习网络编程 并在这个过程中学习C 我对结构感到困惑sockaddr这是一个通用地址 并且sockaddr in 我的书里是这么说的 因此 我们可以填写 sockaddr in 的字段 然后强制转换 a 指向 它指向 指向 soc
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 实体框架 - 循环更新属性

    我正在尝试找到一种方法来循环 EF 对象的属性并更新这些属性的值 更具体地说 我有 50 个字段 其中最多填充 50 个下拉列表 所有 50 个可能都需要填充 也可能不需要填充 为了解决这个问题 我有一个中继器 最多可以创建 50 个 DD
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的
  • VBA 中的 VSTO:AddIn.Object 有时不返回任何内容 (null)

    Given VSTO 插件 An override object RequestComAddInAutomationService 它返回一个名为的类的实例Facade在我的场景中 Excel 2007 中的 VBA 宏可访问AddIn O
  • 多个源文件中包含包含“const”的头文件

    Why does not包含定义的头文件const并被多个源文件包含会产生编译错误multiple definition const in header file h const int num 5 int x Error Multiple
  • Reflection.Emit 中的短格式操作码错误

    我正在制作一种与以下非常相似的小语言hlsl但仅支持像素着色器 该语言使用reflection emit构建实现相同功能的 NET 程序集 我目前正在测试分支指令的实现if在我的一个单元测试中 一个大的if与内if elses 失败并显示以
  • 无法使用 ASP.NET Core 从 JWT 令牌获取声明

    我正在尝试使用 ASP NET Core 实现 JWT 持有者身份验证的非常简单的实现 我从控制器返回的响应有点像这样 var identity new ClaimsIdentity identity AddClaim new Claim
  • 将 try_emplace 与 shared_ptr 一起使用

    所以我有一个std unordered map
  • 为什么在 Linux 上字符串文字的内存地址与其他字符串文字的内存地址如此不同?

    我注意到字符串文字在内存中的地址与其他常量和变量 Linux 操作系统 非常不同 它们有许多前导零 未打印 Example const char h Hi int i 1 printf p n void h printf p n void
  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • 平衡两轮机器人而不使其向前/向后漂移

    我正在尝试设计一个控制器来平衡 2 轮机器人 约 13 公斤 并使其能够抵抗外力 例如 如果有人踢它 它不应该掉落 也不应该无限期地向前 向后漂移 我对大多数控制技术 LQR 滑模控制 PID 等 都很有经验 但我在网上看到大多数人使用 L
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • 读取所有进程内存以查找字符串变量c#的地址

    我有 2 个用 C 编写的程序 第一个名为 ScanMe 的程序包含一个包含值 FINDMEEEEEEE 的字符串变量 以及一个值为 1546 22915487 的双精度变量 另一个名为 MemoryScan 的程序读取第一个程序的所有内存
  • 如何使用包含的转换的排名来比较两个标准转换序列

    include
  • 为什么 MISRA:2012 需要函数原型?

    我想知道为什么 MISRA 2012 需要函数原型 在下面的示例中 这两个原型并不是真正必要的 include
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • Yield Return == IEnumerable 和 IEnumerator 吗?

    Is yield return实施的捷径IEnumerable and IEnumerator 是的 您可以在我的书 C in Depth 的第 6 章中找到更多相关信息 幸好第六章是免费提供 http www manning source
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He

随机推荐

  • RScript 用自己的值创建世界地图

    我希望能够为很多国家绘制我自己的价值观 例如 中国 美国 英国 加拿大和俄罗斯 我有自己的 txt 文件 其中包含 3 列 ISO3V10 国家 地区和文档数量 ISO3V10 Country No of Documents CAN Can
  • Camel http4 和 url 编码的密码被解释为单独的参数

    我们有一个 Apache Camel 2 13 2 应用程序 它使用 http4 与网络服务器通信 并使用 NTLM 进行身份验证 端点定义为 伪 to http4 thegreat server com uri authUsername
  • Python File 对象到 Flask 的 FileStorage

    我正在尝试在 Flask 中测试我的 upload 方法 唯一的问题是文件存储Flask 中的对象有一个方法 save PythonFile对象没有 我像这样创建我的文件 file open documents test test pdf
  • Matlab:如何在散点图中设置图例的颜色,其中每个数据点获得不同的颜色?

    这是示例代码 x rand 100 1 y rand 100 1 score rand 100 1 figure colormap flipud bone caxis 0 1 axis 0 1 0 1 scatter x y 50 scor
  • SqlCeParameter返回自动ID(主键)

    我有一个SQLSqlCeParameter声明例如 mySQLCommand1 CommandText INSERT INTO clientSubjectiveComplaints clientSubComplaintCreated VAL
  • 使用 https 进行 WCF 服务自托管

    目前 我们的一台客户端计算机中有一个作为 Windows 服务托管的 Wcf 服务 实际上目前它正在使用正常的 http 调用 由于我们需要使用 https 而不是 http 因此我们修改了 app config 但启动服务后 https
  • 删除 c++ std::vector 中的所有项目

    我正在尝试删除其中的所有内容std vector使用以下代码 vector erase vector begin vector end 但它不起作用 更新 clear不会破坏向量保存的元素吗 我不想这样 因为我仍在使用这些对象 我只想清空容
  • 使用 Apache CXF 和 CDI 的 Spring Boot

    使用时Apache 的 CXF JAX RS Spring Boot 启动器 http cxf apache org docs springboot html SpringBoot SpringBootCXFJAX RSStarter与CX
  • 将现有 WAR 部署到嵌入式 Jetty

    我的目的是将现有的 WAR 部署到嵌入式 Jetty 9 4 5 不幸的是 当我尝试打开页面 JSP 时出现以下错误 An error occurred at line 52 in the generated java file tmp e
  • Oracle SQL中如何获取与正则表达式匹配的字符串的一部分

    假设我在表的某些字段中有以下字符串 product 1627 color 45 size 7 我想查询颜色并得到 45 通过这个查询 SELECT REGEXP SUBSTR product 1627 color 45 size 7 col
  • 如何在设备树源文件中添加注释

    如何在设备树源文件中添加多行或单行注释 我到处都找不到它 使用注释的默认 c 方式是否有效 使用注释的默认 c 方式是否有效 是的 使用 comment ADDENDUM 我还使用过 C 预处理器 if 0 and endif在测试期间快速
  • 如何在使用inputView后显示键盘

    I used inputView以显示uipickerview for my textfield 但我用同样的textfield用于其他功能 使用后如何显示标准键盘inputView为了那个原因textfield textfield inp
  • Android 中的底部按钮栏

    我想知道如何在 android 中创建底部栏按钮 我读到了一些关于这个 U I 的内容 解决办法 有什么控件可以使用吗 您可以在相对布局中执行类似的操作
  • 我正在尝试解决“15 个难题”,但出现“OutOfMemoryError”[已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有没有一种方法可以优化此代码以免耗尽
  • 使用分页 extjs 在组合框中搜索

    您好 我正在尝试在组合框中进行搜索 它正在工作 但仅在当前页面中搜索我也使用分页搜索 我需要在所有页面中搜索而不仅仅是当前页面 任何建议 xtype combo fieldLabel Organization Id name company
  • 将 Streaming Flux 的 WebClient Post 拆分为 JSON 数组

    我正在使用第三方 REST 控制器 它接受 JSON 对象数组并返回单个对象响应 当我使用有限的 WebClient 进行 POST 时Flux代码有效 我认为 因为Flux完成 然而 当Flux可能是无限的 我该怎么办 以数组块形式发布
  • 如何在CSS多列布局中将单列居中

    我有一个使用 CSS 多列布局的元素来显示项目列表 div style text align center div Item 1 div div Item 2 div div Item 3 div div Item 4 div div It
  • 在 C# 中从未知长度的流计算哈希值

    C 中计算未知长度流的 动态 md5 之类哈希的最佳解决方案是什么 具体来说 我想根据通过网络接收的数据计算哈希值 我知道当发送者终止连接时我已经完成接收数据 所以我事先不知道长度 编辑 现在我正在使用 md5 并在保存数据并将其写入磁盘后
  • GitHub 页面上的 AngularJS html5mode 支持

    问题是 does GitHub 页面支持AngularJShtml5mode 我找到了一个www资源 https coderwall com p kfomwa angularjs html5mode on github pages其中指出可
  • 线程不活动时释放资源

    我正在使用BackgroundWorker 在其中我使用foreach循环 在其中创建新线程 等待它完成 然后报告进度并继续foreach循环 这就是我要说的 private void DoWork object sender DoWork