C# 多线程 — 从MES系统开发谈多线程
前段时间在开发MES系统(手机生产),里面有一个工序是装周转车,其实思路很简单,就是将每一个产品的SN号(唯一)和小车的SN号加个关联,标识这个SN现在装在这个小车里面。
因为工厂的操作大部分都是扫描枪进行操作的 ,
所以操作的顺序也就是这样: 扫描小车号(0001) 扫描产品SN号(000001,000002....)
车子的容量是120,在扫描完最后一个后, 数据库的操作是 新增120条记录。然后还有一个操作(120个产品过站,什么是过站,你不懂也没关系,你就知道 它是一个挺长的时间就好)
软件第一版没有利用多线程,我记得当时的速度 是过站时间 20S:这里不要骂我 说我软件写的很烂,逻辑有问题,数据访问有问题之类的,因为那不是我写的 ,
这里我们撇开逻辑代码和数据访问代码的优劣,因为我接到这个问题的时候第一反应 就是为毛不用多线程?
这里我们写一个很傻逼的方法,耗时很久的
int valueresult = 0; for (int i = 0; i <= 2000; i++) { Thread.Sleep(50); valueresult++; } this.textBox1.Text = valueresult.ToString();
在运行这样耗时很久的方法时,页面都是这样的,不能进行任何操作,会假死在那里,显示未响应
public delegate void SetvalueHandler(string str); public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Thread param = new Thread(() => Getsum()); param.Start();//开启线程 } public void Getsum() { int valueresult = 0; for (int i = 0; i <= 2000; i++) { Thread.Sleep(5); valueresult++; } //第一种 //SetvalueHandler setvalue = new SetvalueHandler(Setvalue); //this.textBox1.Invoke(setvalue,valueresult.ToString()); //第二种 this.textBox1.Invoke(new MethodInvoker(() => Setvalue(valueresult.ToString()))); } public void Setvalue(string str) { this.textBox1.Text = str; } }
在看下修改后的代码,加入了多线程 再进行计算的时候 ,界面不会出现假死,输入框也是可以输入值的,当计算结束后,窗体文本框就有值了,
再来说上面的问题,我们说 一个车子装120个产品 的处理时间是20S,那么我们扫描小车,再扫描一百二十个产品的时间呢? 别告诉我是几秒钟,
那我们是不是可以 在它扫入最后一个产品的时候,开启一个线程,让他自己去写数据库,这时候你前台界面再继续扫描另外的小车河产品?