当生成矩阵条形码时,每10000个文件需要1分钟,这就是如何在更短的时间内生成大量的矩阵条形码。
这里是用来编码数据的库。
我的按钮生成代码:
Class1 CLS = new Class1();
DataTable dt = CLS.ShowalldataSerial(textBox4.Text);
for (int i = 0; i <= Convert.ToInt32(textBox1.Text); i++)
{
Serial = SRL.Rnd().ToString();
txt = "UserID" + dt.Rows[0][0] + "FirmName" + dt.Rows[0][1] + "OrderNo" + dt.Rows[0][2] + "BtachNo" + dt.Rows[0][3] + "Quantity" + dt.Rows[0][4] + "ProductName" + dt.Rows[0][5] + "SerialNo" + Serial;
dm.DM(txt, Color.FromName(comboBox1.SelectedItem.ToString()), Color.White).Save(root + "\\" + Serial + ".emf", System.Drawing.Imaging.ImageFormat.Emf);
}
MessageBox.Show("Records generated success ");当在textbox1中创建10000时,需要1分钟。如果我用textbox1写200000,要花20分钟。
代码工作正常,没有任何问题,给出了我需要的结果,但速度很慢。有人能帮我加快速度吗?
发布于 2017-05-07 15:54:19
StringBuilder和Append()方法来构建字符串。Convert.ToInt32(textBox1.Text)在for循环之前将值转换为int,并将值保存在变量中,而不是以后使用变量而不是每次转换值。另一个例子是comboBox1.SelectedItem.ToString()。发布于 2017-05-08 09:21:26
我完全同意丹尼斯的回答。除此之外,我还要补充一句:
对不起,我又在想上面的第4点,被一个疑问所打动,又被检查了一遍,这里你做的事情根本没有意义:
txt = "UserID" + dt.Rows[0][0] + "FirmName" + dt.Rows[0][1] + "OrderNo" + dt.Rows[0][2] + "BtachNo" + dt.Rows[0][3] + "Quantity" + dt.Rows[0][4] + "ProductName" + dt.Rows[0][5] + "SerialNo" + Serial;您正在每个循环中重新构建完全相同的基字符串,一次又一次,这有什么意义?除了序列号之外,您的字符串是相同的,所以在for循环之外构建一次并重用它。您甚至不需要在这里使用StringBuilder,因为通常情况下,当您连接超过3个字符串时,它开始变得更快,否则普通的普通字符串连接更好。
像这样的事情应该可以做到:
Class1 CLS = new Class1();
DataTable dt = CLS.ShowalldataSerial(textBox4.Text);
string baseText = "UserID" + dt.Rows[0][0] + "FirmName" + dt.Rows[0][1] + "OrderNo" + dt.Rows[0][2] + "BtachNo" + dt.Rows[0][3] + "Quantity" + dt.Rows[0][4] + "ProductName" + dt.Rows[0][5] + "SerialNo";
Color foregroundColor = Color.FromName(comboBox1.SelectedItem.ToString());
int serialsToGenerate = Convert.ToInt32(textBox1.Text);
Parallel.For(0, serialsToGenerate, index=>
{
string Serial = SRL.Rnd().ToString();
string txt = baseText + Serial;
// WARNING HERE
DM_Encoder dm = new DM_Encoder();
dm.DM(txt, foregroundColor, Color.White).Save(root + "\\" + Serial + ".emf", System.Drawing.Imaging.ImageFormat.Emf);
});Parallel.For的内容将在多线程中执行,因此您需要一个您修改的每个变量的唯一实例,并且对于您调用的方法的每个类都需要一个唯一的实例,因此请注意
// WARNING HERE因为我不知道您以前是如何安装和设置dm对象的,所以这里也需要这样做;我只是向构造函数添加了一个泛型调用,以帮助您理解。
另一个很大的警告是:你需要了解多线程编程,否则这段代码迟早会在你面前爆炸。通常是在最糟糕的时刻。
https://codereview.stackexchange.com/questions/162767
复制相似问题