private void DoHandler()
{
string path; DisplayProcessStatus("正在校验用户输入参数.");
ChangedProcessStatus(0);
if (!Validate(out path)) return; DisplayProcessStatus("正在从数据库中组织数据.");
Cursor.Current = Cursors.Cross;
List<string> msgs = _PaiShuiGongSiWenBenBLL.SelectPaiShuiGongSiWenBen(); if (msgs.Count == 0)
{
DisplayProcessStatus("写入0条记录.");
progressBarControl1.Position = 100;
DisplayProcessStatus("处理完成.");
return;
} DisplayProcessStatus("正在写入文件.");
int count = msgs.Count; FileStream fs = new FileStream(path, FileMode.Create);
StreamWriter sw = new StreamWriter(fs); using (fs)
using (sw)
{
for (int i = 0; i < count; i++)
{
sw.WriteLine(msgs[i]);
System.Threading.Thread.Sleep(200);
ChangedProcessStatus((int)((decimal)(i + 1) / (decimal)count * 100));
Application.DoEvents();
}
}
Cursor.Current = Cursors.Default;
DisplayProcessStatus("处理完成.");
}1、msgs.Count至少有200000数据量
在写.txt文件时,使用for循环遍历集合,速度非常的慢,写完200000数据量至少要10分钟。
请问,有什么办法解决这个问题?我想尝试数据分页(页大小10000),每次清空msgs,在for循环重新加载数据,然后给count以及i重新赋值,再执行循环,不知道这样时间上会不会有所改进。哪位有比较好的解决方案?2、程序中,在生成txt文件的过程中,把鼠标设置成十字形,如果程序一直是当前显示窗体,会一直保持十字形直到文本生成结束;如果此刻把程序不是当前显示窗体(也就是说,先把程序窗体最小化到任务栏),然后再让程序成为当前活动窗体,此处鼠标样式恢复到原来样式。怎么才能让鼠标的样式在整个文本生成结束之前一直保持十字形,而不管程序窗体是不是当前活动窗体呢?
单线程没必要还用Sleep
单线程,以前在处理少量数据是写的程序,进程Sleep一下,不至于进度条进度太快,以显示动态效果,
10次就是2秒
10000次就是2000秒,
这个时间不都被你sleep完了么?
真怀疑10分钟怎么能执行完~
单线程,不要用Sleep,不然时间损耗太大
大数据量批处理任务,可以考虑多线程,一般固定10-20线程就可以,试机器性能而定
^_^,这个我刚才也注意到了。
进程休眠200ms啊真害苦我了!
这段代码是我在另一个生成欠费短信通知单时使用的(欠费短信数据量不过400条数据量,为了显示动态效果嘛)
新系统里,直接copy过来了,没重新写。我说时间怎么会这么慢呢,检查了一下程序,才发现这段代码怎么还在。
2、当你的窗体处于激活状态的时候判断你的任务是否完成,设置鼠标即可。任务是否完成应该是有工作线程通知UI线程并且设置某一个全局变量。
1.尽量优化循环语句得代码。减少空的语句
2.不sleep,就不要
3.是否能够多线程处理
4.是否可以分布式处理
5.多用缓存,不要过于访问硬盘或数据库,但一定要做数据的备份
6.优化算法
...
学习哈
新系统里,直接copy过来了,没重新写。所有Sleep...^_^
现在去掉休眠了..