我在C#中的应用程序,WPF使用C 库中的API进行图像处理。我需要一次处理六个图像,因为这六个对象可以为此提供。当图像准备好处理时,它将被分配给线程池的线程。以下代码用于此。
ThreadPool.QueueUserWorkItem(ThreadPoolCallback, imageTuple);
在" ThreadPoolCallback"中称为API。
在我的开发笔记本电脑中,执行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);
}
}
首先,您应该确保实时系统处理6个线程的速度更快。您可以在两个系统上下载和解开拉链7ZIP,并通过6个线程从Commandline运行一些基准:
7z b -mmt6
线程池线程不适合长时间运行的任务,并且可能会在某些Net Framework过程中占用。通常,线程池中的每个CPU 250个线程。此外,您可以检查是否在方法中锁定了一些阻止线程池计划的代码。
我建议您如果任务耗时,请勿使用线程池线程。
以下是您可以使用的两个选项,它将使用新线程而不是线程池一个。
var imageTuple = "blqhblah";
Task.Factory.StartNew(() => ThreadPoolCallback(imageTuple),TaskCreationOptions.LongRunning);
和
var thread=new Thread(()=>ThreadPoolCallback(imageTuple));
thread.Priority = ThreadPriority.AboveNormal;
thread.Start();