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文件的过程中,把鼠标设置成十字形,如果程序一直是当前显示窗体,会一直保持十字形直到文本生成结束;如果此刻把程序不是当前显示窗体(也就是说,先把程序窗体最小化到任务栏),然后再让程序成为当前活动窗体,此处鼠标样式恢复到原来样式。怎么才能让鼠标的样式在整个文本生成结束之前一直保持十字形,而不管程序窗体是不是当前活动窗体呢?

解决方案 »

  1.   

    System.Threading.Thread.Sleep(200);单线程/多线程?
    单线程没必要还用Sleep
      

  2.   


    单线程,以前在处理少量数据是写的程序,进程Sleep一下,不至于进度条进度太快,以显示动态效果,
      

  3.   

    你写一次sleep 200ms,
    10次就是2秒
    10000次就是2000秒,
    这个时间不都被你sleep完了么?
    真怀疑10分钟怎么能执行完~
      

  4.   

    进度条可以按比例动,不用每条都动
    单线程,不要用Sleep,不然时间损耗太大
    大数据量批处理任务,可以考虑多线程,一般固定10-20线程就可以,试机器性能而定
      

  5.   


    ^_^,这个我刚才也注意到了。
    进程休眠200ms啊真害苦我了!
    这段代码是我在另一个生成欠费短信通知单时使用的(欠费短信数据量不过400条数据量,为了显示动态效果嘛)
    新系统里,直接copy过来了,没重新写。我说时间怎么会这么慢呢,检查了一下程序,才发现这段代码怎么还在。
      

  6.   

    你的时间全部被你sleep掉啦,去掉sleep, refresh一下,进度条更新
      

  7.   

    1、磁盘的IO确实很慢,你可以考虑一个建立一个缓冲区,先写到缓冲区里面,缓冲区满了再将缓冲区的内容写到磁盘上,缓冲区的大小则根据你的内存来定。磁盘写入大块数据效率还是很快的,就怕一次写一点,毕竟磁盘是要转着写的,寻址时间较长。
    2、当你的窗体处于激活状态的时候判断你的任务是否完成,设置鼠标即可。任务是否完成应该是有工作线程通知UI线程并且设置某一个全局变量。
      

  8.   

    为何不考虑使用异步或者多线程, 这样不会阻塞主线程?另外代码中为何用用Sleep?花费无谓的时间?
      

  9.   

    这里大家只能给你建议。
    1.尽量优化循环语句得代码。减少空的语句
    2.不sleep,就不要 
    3.是否能够多线程处理
    4.是否可以分布式处理
    5.多用缓存,不要过于访问硬盘或数据库,但一定要做数据的备份
    6.优化算法
    ...
      

  10.   

    恩,感觉Sleep造成大量事件浪费
    学习哈
      

  11.   

    没啥好办法。有时候这是架构是太固执己见造成的。为什么不可以写到100个txt文件中去,只能写成1个?
      

  12.   

    这段代码是我在另一个生成欠费短信通知单时使用的(欠费短信数据量不过400条数据量,为了显示动态效果嘛) 
    新系统里,直接copy过来了,没重新写。所有Sleep...^_^
    现在去掉休眠了..
      

  13.   

    1. 除非你每次写文件都flush,系统本身就会缓冲你的数据。用不着你自己建立缓冲。