【问题标题】:Most efficient way to use and communicate with many threads使用多个线程并与之通信的最有效方式
【发布时间】:2013-07-30 23:04:54
【问题描述】:

我正在编写一个在后台运行许多线程的应用程序,这些线程必须向主线程报告,以便它可以更新界面中的表。过去,工作线程是普通的独立类(名为 Citizen),我使用类似的方法从主线程运行它们

new Thread(new ThreadStart(citizen.ProcessActions)).Start();

其中 ProcessActions 函数是完成所有后台工作的主要函数。在实际启动线程之前,我会注册事件处理程序,以便 Citizen 线程可以将一些内容记录/报告到接口。通常,有数十个这样的 Citizen 线程(大约 50 个)并且它们是相当大的类 - 每个都有自己的 HTTP 客户端并浏览 Web。

这是管理线程的好方法吗?坦率地说,可能不会;我很确定线程没有正常退出 - 一旦 ProcessActions 函数完成,我会删除事件处理程序,仅此而已 - 内存使用量随着每个新 Citizen 的启动而不断增加。

管理许多(50 多个)线程的最佳方法是什么,您必须经常与之通信?我相信我不必担心 Citizen 变量的线程安全性,因为我不会从其他线程访问它们,但它是自己的线程。

【问题讨论】:

  • 你使用的是什么版本的 C#?
  • 线程一结束就应该被杀死,一定是有什么东西让他们活着......
  • 我使用的是 C# 4.0。事件处理程序能让它们保持活力吗?也许我没有正确删除它们。
  • 这些线程是否在执行一些 IO?它们通常运行多长时间才能完成?
  • 嗯,他们确实记录到 .txt 文件。但是我关闭了流……它们通常会运行大约 5 分钟。

标签: c# .net multithreading


【解决方案1】:

我认为您正在寻找的是一个线程池。 Here's an MSDN article on them 应该在 C# 4.0 中可用。

这个想法是创建一个线程池,将其计数设置为某个较高的数字(例如 50),然后开始将线程分配给任务。如果池需要扩展,它可以,但是通过预先声明一个高数字,您可以避免所有昂贵的线程创建。

将您想要完成的任务“排队”并在线程可用时分配这些任务可能会有所帮助。

此外,内存泄漏可能很难找到,但我会从测试简单的情况开始:取出所有线程(只需从主线程中一个接一个地运行 Citizen)并让它运行很长时间。如果它仍然在泄漏内存,那么您的线程管理就不是问题了。

【讨论】:

  • 队列也有利于分配任务优先级。
猜你喜欢
  • 1970-01-01
  • 2015-08-10
  • 2015-06-06
  • 2011-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-30
  • 1970-01-01
相关资源
最近更新 更多