我写了一个文件处理程序
大致的意思就是遍历文件夹,找到我想要的文件
然后把文件的详细路径一个个输出到TextBox.Text里面,我用的方法是这样for( .... )
   TextBox1.Text += fileName + "\r\n";但随着找到的文件数量增多,系统就会越来越慢~非常慢~
因为每次字符串连接操作都要串建一个新字符串~
不知道怎么能解决这个问题,
或者用什么别的方式解决这个问题?我的目的就是:
能即时看到程序现在在干什么,而且能知道程序都干了些什么~(最好能拷贝这些信息)

解决方案 »

  1.   

    StringBuilder 理论上速度是string的 5000倍,还有你不要直接赋值给textbox,先给一个StringBuilder,再把StringBuilder赋值给textbox
      

  2.   

    StringBuilder 理论上速度是string的 5000倍
    -----------------------
    有依据吗?
      

  3.   

    你确信string tempString="";
    for( .... )
        tempString += fileName + "\r\n";
    TextBox1.Text=tempString;和你的for( .... )
       TextBox1.Text += fileName + "\r\n";一样慢吗?我怀疑你说的所谓“慢”根本不是字符串处理的问题造成的,字符串处理方法对你的“慢”来说是很可能只是个似是而非的解答。
      

  4.   

    你把string tempString="";
    for( .... )
        tempString += fileName + "\r\n";
    TextBox1.Text=tempString;中的 for 和 .Text=... 单独设置两个计时器看看各花费多少时间。
      

  5.   

    慢是因为textbox要不断向里面画text,如果使用textbox1.text &="hello"这样的话每次都要重画所有的文本,当然会导致速度越来越慢了。
    如果使用textbox1.AppendText("hello")效果一样,但每次只需画新添加的字符,速度当然快得多。
      

  6.   

    经过测试以下代码速度之差让人吃惊:
    debug.print(now)
    for i as int32 =0 to 10000
    richtextbox1.append("hello")
    next
    debug.print(now)
    输出:
    2006-9-3 16:55:19
    2006-9-3 16:55:43
    而如果使用
    richtextbox1.text &="hello"
    输出:
    2006-9-3 16:56:25
    然后10分钟后都没执行完毕,我中断了程序,你们有兴趣可以试一下
      

  7.   

    StringBuilder 理论上速度是string的 5000倍
    ----------------------------------------------
     我不太相信,只不过一个是预分配了内存而已,都是内存操作,有这么大区别吗?
      

  8.   

    TextBox1.AppendText 可以替代
    TextBox1.Text += 操作!
      

  9.   

    为什么AppendText只能最多附加32,766个字符?
    我设置了MaxLength属性,都不听使唤~
    如果用手输入,MaxLength就有效~
      

  10.   

    哦,发现,把TextBox换成RichTextBox就可以随意append了~
    但速度还是越来越慢啊~
    累计操作,就会变得很慢~
    看来这个问题属于疑难杂症了~看下面这个调试程序就比较清楚了:private System.Windows.Forms.RichTextBox richTextBox1;
    private System.Windows.Forms.Button button1;
    private System.Windows.Forms.RichTextBox richTextBox2;private void button1_Click(object sender, System.EventArgs e)
    {
    for ( int i = 0 ; i < 10 ; i ++ )
    {
    richTextBox2.AppendText( 
    string.Format("第({0})用时:{1} \r\n",i.ToString() , 
    printHello(1000).ToString() )); }

    }private long printHello( int printCount )
    {
    long startTime = DateTime.Now.Ticks;
    long endTime = 0; for ( int i = 0 ; i < printCount ; i ++ )
    {
    richTextBox1.AppendText("hello!");
    } endTime = DateTime.Now.Ticks; return endTime - startTime;
    }点击button1,结果:第(0)次用时:6093750 
    第(1)次用时:6562500 
    第(2)次用时:7187500 
    第(3)次用时:7656250 
    第(4)次用时:8281250 
    第(5)次用时:8906250 
    第(6)次用时:9531250 
    第(7)次用时:10156250 
    第(8)次用时:10781250 
    第(9)次用时:12031250 可以看到,速度是越来越慢~
    这样的问题可以解决吗?
      

  11.   

    用StringBuilder试试看,这是一个很好检验StringBuilder效率的地方。
      

  12.   

    用AppendText()会快得多,当然,加得太长性能降低是难免的。我曾经用过RichTextBox,速度还不错。
      

  13.   

    多线程搜索目录,
    异步调用更新Textbox的显示信息,
    使用
    Textbox.AppendText 方法 
    或使用StringBuilder来保存字符串。
      

  14.   

    看看事实:string fileName = "kaksdfkasdkfasdflas kdfasdfasdfasd";
    string tempString = string.Empty;
    DateTime bt = DateTime.Now;
    for (int i = 0; i < 10000; i++)
        tempString += fileName + "\r\n";
    textBox1.Text = tempString;
    DateTime et = DateTime.Now;
    MessageBox.Show(string.Format("TextBox += 用时 {0} 秒", ((TimeSpan)et.Subtract(bt)).TotalSeconds));
    bt = DateTime.Now;
    for (int i = 0; i < 10000; i++)
        textBox1.AppendText( fileName + "\r\n");
    et = DateTime.Now;
    MessageBox.Show(string.Format("AppendText() 用时 {0} 秒", ((TimeSpan)et.Subtract(bt)).TotalSeconds));
    bt = DateTime.Now;
    for (int i = 0; i < 10000; i++)
        textBox1.Text += fileName + "\r\n";
    et = DateTime.Now;
    MessageBox.Show(string.Format("TextBox += 用时 {0} 秒", ((TimeSpan)et.Subtract(bt)).TotalSeconds));
      

  15.   

    string fileName = "kaksdfkasdkfasdflas kdfasdfasdfasd";
    string tempString = string.Empty;
    DateTime bt = DateTime.Now;
    for (int i = 0; i < 10000; i++)
        tempString += fileName + "\r\n";
    textBox1.Text = tempString;
    DateTime et = DateTime.Now;
    MessageBox.Show(string.Format("tempString += 用时 {0} 秒",
        ((TimeSpan)et.Subtract(bt)).TotalSeconds));
    bt = DateTime.Now;
    for (int i = 0; i < 10000; i++)
        textBox1.AppendText(fileName + "\r\n");
    et = DateTime.Now;
    MessageBox.Show(string.Format("AppendText() 用时 {0} 秒",
        ((TimeSpan)et.Subtract(bt)).TotalSeconds));
    bt = DateTime.Now;
    for (int i = 0; i < 10000; i++)
        textBox1.Text += fileName + "\r\n";
    et = DateTime.Now;
    MessageBox.Show(string.Format("TextBox += 用时 {0} 秒",
        ((TimeSpan)et.Subtract(bt)).TotalSeconds));
      

  16.   

    AppendText 已经慢的令人无法忍受了。
      

  17.   

    StringBulder可以让那个tempString进一步缩小到十分之一时间。不过因为本来已经很快,这在开发时只能说是可以进一步“更好地优化”,而不算是什么失误。一般也不用计较。