我的C#应用程序使用C++库中的API进行图像处理。我需要一次处理六个图像,因为这六个对象可用于此。当图像准备好处理时,它将被分配到线程池中的线程。下面的代码用于此。
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);在"ThreadPoolCallback“中,正在调用图像处理接口。
就我的问题而言,在我的开发笔记本电脑上,仅执行API的时间就是3- 3.5秒。但是,当同样的代码在自动化系统中执行时,其IPC具有更好的规范,API执行时间为8-9秒。
我的开发机器有8核处理器和16 GB内存,自动化系统中的IPC有14核处理器和32 GB内存。
我已经检查了一些基本的东西,比如内存激增,cpu利用率变高等等。但他们中的任何一个都没有表现出任何值得担忧的地方。两个系统的唯一区别是IPC安装了NI Labview安装程序。
寻找一些建议来改善我的并行执行时间。我是否可以使用专用核心或其他任何核心。
提前感谢
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);
public void ThreadPoolCallback(Object threadContext)
{
try
{
var result = visionProcessingUnit.ExecuteInspection(imageTuple.Item3, imageTuple.Item2.ImageData, VIBitmap.Width, VIBitmap.Height);;
}
catch (Exception ex)
{
Logger.Exception("VisionHandler.cs", ex);
}
}发布于 2019-05-03 14:57:53
首先,你应该确保你的实时系统能更快地处理6个线程。您可以在两个系统上下载并解压缩7zip,然后从命令行运行一个包含6个线程的小基准测试:
7z b -mmt6发布于 2019-05-03 15:11:47
CPU线程不适合长时间运行的任务,可能会被一些net框架占用。processes.Usually线程池中每个ThreadPool有250个线程。此外,您还可以检查是否锁定了方法中的某些代码,从而阻塞了线程池调度。
如果任务很耗时,我建议您不要使用线程池线程。
下面是您可以使用的两个选项,这两个选项将使用新线程而不是线程池。
var imageTuple = "blqhblah";
Task.Factory.StartNew(() => ThreadPoolCallback(imageTuple),TaskCreationOptions.LongRunning);和
var thread=new Thread(()=>ThreadPoolCallback(imageTuple));
thread.Priority = ThreadPriority.AboveNormal;
thread.Start();https://stackoverflow.com/questions/55964462
复制相似问题