前言
有时候我们需要多个任务同时执行,有的人喜欢用线程Thread,有的人喜欢使用Task,还有的人喜欢用ThreadPool,这里就测试下他们三都同时运行同样逻辑的性能表现。任务数量1000,任务内容为读取1张图像并处理,有100m延时逻辑,记录了启动时间、工作时间、总计用时等信息。
1、结果数据
2、任务内容
{
MyDataInfo myData = (MyDataInfo)obj;
myData.StartTime2 = DateTime.Now;
Thread.Sleep(SleepTime);
string imgFile = filenames[myData.WorkId % 9];
HImage image = new HImage(imgFile);
image.GetImageSize(out int w, out int h);
HRegion region = image.Threshold(50.0, new Random(DateTime.Now.Millisecond).Next(150, 255));
if (IsDispImg)
{
HWindow hWindow = GetHWindow(myData.WorkId % 9);
hWindow.DetachBackgroundFromWindow();
hWindow.ClearWindow();
hWindow.SetPart(0, 0, h - 1, w - 1);
hWindow.AttachBackgroundToWindow(image);
hWindow.SetColor("green");
hWindow.SetLineWidth(2);
hWindow.SetDraw("margin");
hWindow.DispObj(region);
}
region.Dispose();
image.Dispose();
myData.SetWorkOver();
}
3、线程运行
UseModel = "Thread";
for (int i = 0; i < TaskNum; i++)
{
int cuIndex = i;
var para = new MyDataInfo(i);
myDataInfos.Add(para);
Thread thread = new Thread(new ParameterizedThreadStart(ProcessImage));
thread.Start(para);
}
4、任务运行
UseModel = "Task";
for (int i = 0; i < TaskNum; i++)
{
int cuIndex = i;
var para = new MyDataInfo(cuIndex);
myDataInfos.Add(para);
Task.Run(() =>
{
ProcessImage(para);
});
}
5、线程池运行
UseModel = "ThreadPool";
for (int i = 0; i < TaskNum; i++)
{
int cuIndex = i;
var para = new MyDataInfo(cuIndex);
myDataInfos.Add(para);
ThreadPool.QueueUserWorkItem(ProcessImage, para);
}
6、等完成逻辑
Task.Run(() =>
{
Thread.Sleep(1000);
while (true)
{
if (myDataInfos.Find(t => t.WorkMode == 0) == null)
{
break;
}
Thread.Sleep(5);
}
stopwatch.Stop();
Console.WriteLine("Task Run Over ");
Record();
Invoke(new Action(SetInfo));
});
7、数据结构
public class MyDataInfo
{
public DateTime StartTime { get; set; }
public DateTime StartTime2 { get; set; }
public DateTime EndTime { get; set; }
public int WorkMode = 0;
public int WorkId { get; set; }
//工作时间
public double GetTimeMarg
{ get { return (EndTime - StartTime2).TotalMilliseconds; } }
//启动时间
public double StartTimeMarg
{ get { return (StartTime2 - StartTime).TotalMilliseconds; } }
//总计时间
public double TotalTime
{ get { return (EndTime - StartTime).TotalMilliseconds; } }
public MyDataInfo(int id)
{
WorkId = id;
StartTime = DateTime.Now;
}
public void SetWorkOver()
{
WorkMode = 1;
EndTime = DateTime.Now;
Console.WriteLine($"{EndTime.ToString("HH:mm:ss:ffff")} ProcessImage {WorkId} Over {(EndTime - StartTime).TotalMilliseconds}ms!");
}
}