【问题标题】:Is opening a thread in C# related to a CPU thread? [closed]在 C# 中打开一个与 CPU 线程相关的线程吗? [关闭]
【发布时间】:2020-02-27 13:08:09
【问题描述】:

我正在使用 3rd 方库录制多个 USB 摄像头。为此,我将每个相机的数据记录在 C# 中的单独线程上。问题是应用程序有时无法获取所有数据。 因此,我想知道打开 C# 线程是否会阻塞我的 CPU 线程,因为我的 CPU 是 4 核 / 4 线程。 CPU 内核/线程是否与我们在 C# 中初始化的线程相关?

【问题讨论】:

  • 请定义“阻塞线程”和“密集”。另外,请解释您为什么认为这会是一个问题。
  • 你能更详细地解释一下你在用相机做什么,以及你在架构方面是如何运行的吗?您是在使用相机每隔一分钟采样一次图片,还是连续将相机曝光的内容转储到 HDD?
  • 不要将 .NET 线程与操作系统线程混为一谈。它们是抽象的,不一定 1:1 映射。
  • 我正在录制多台摄像机的视频......同时有很多交易正在进行,所以我想知道我是否正在打开 4 个线程并且我的 cpu 是 4 个核心 4 个线程......我的 4 个线程会阻塞吗录制视频时的cpu??
  • 我认为录制视频是一项 cpu 密集型任务,或者换句话说,它会持续很长时间阻止 cpu 核心处理任何其他事务..这是我的问题

标签: c# .net windows cpu-usage


【解决方案1】:

嗯,这取决于您将如何完成这项任务。录制相机视频可能是某些 3rd 方库的功能,并且该库的 API 可能已经需要您的 UI(主)线程才能执行任务。如果您正在实现自己的低级记录 API 并希望从该 API 接收数据,那么您可能希望在单独的线程中运行数据获取,只需使用:

Task.Run(()=> {
  // new thread running - your data fetching code here
});

这样,您的主线程将不会被阻塞,并且在新线程上等待将产生相机 API 的结果。

【讨论】:

  • 我正在使用 3rd 方相机 .dll 库录制视频
  • 在单独的线程中启动每个摄像头
  • 有时它没有正确记录,所以我认为它是 cpu 线程问题??
  • 如果没有正确录制,如果你的CPU接近100%,你可以在任务管理器中查看吗? - 这可能会导致一些问题。
  • 我想大致了解 c# 中的线程和 cpu 核心之间的关系,但并不总是......它可能会变高但不是 100%
【解决方案2】:

这完全取决于您使用线程的方式。我可以想到至少 3 种不同的场景 - 1. 您的 cameraThread 被定义为高优先级,因此(即使有时间切片)需要 99% 的时间。 2.您的cameraThread与任务线程池一起运行,因此它被阻塞并与其他线程随机阻塞(资源争用)。 3. 您的摄像机在后台以低优先级发生。

【讨论】:

  • 好吧,我运行一个普通线程来开始录制视频...也许多个摄像头为每个摄像头打开一个线程...但是有时在进行许多交易时,摄像头无法正确记录...所以这就是为什么我要问我是否正在运行 4 个具有 4 个线程的摄像机,而我的 cpu 是 4 核 4 个线程,是否会为每个任务保留一个 cpu 线程?
  • 不,当然不是。您无法控制哪个线程进入哪个核心处理器,此外,还有其他东西在后台运行,例如您的操作系统、后台服务和其他程序。
猜你喜欢
  • 2012-08-30
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多