[size=16px]我要在richtextbox空间里显示程序运行的日志信息,
问题是:我的日志信息也显示了,但是不同步,所说的不同步是当我所有的方法都执行完了以后它是统一显示的,我想让它及时的显示,例如:A类里有个A1方法程序运行到方法的第一句代码是几点几分调用了这个方法,马上让这个信息在窗体的richtextbox空间里显示,方法运行到最后一行也是几点几分这个方法结束,也要马山在空间里显示。[/
size]

解决方案 »

  1.   

    多线程的问题,你可以用LOCK来锁定让他完成了一件事情之后再干另外一个事情
      

  2.   


        public delegate void AddText(string txt);
        private void button3_Click(object sender, EventArgs e)
        {
          Thread t = new Thread(new ThreadStart(Add));
          t.Start();
        }    private void Add()
        {
          int j = 100;
          while (j > 0)
          {
            AddRichText(j.ToString()+ "\r\n");
            j--;
            Thread.Sleep(1000);
          }
          Thread.CurrentThread.Abort();
        }    private void AddRichText(string txt)
        {
          if (!richTextBox1.IsDisposed)
          {
            if (richTextBox1.InvokeRequired)
            {
              AddText at = new AddText(AddRichText);
              richTextBox1.Invoke(at, txt);
            }
            else
            {
              richTextBox1.AppendText(txt);
              richTextBox1.ScrollToCaret();
            }
          }
        }
      

  3.   

    楼主可以用BackGroundWorker,然后用他的ReportProgress方法,如执行完test1()之后,ReportProgress(1);在处理Progress的事件中这样处理:
    if(e.Progress == 1)
    {
        //....
    }
    ......
      

  4.   

    多线程可以实现 的,当然 了,如果不想用多线程的话,那就用datetimer吧,每当某时间后刷新一下richtextbox即可。
      

  5.   

    Application.DoEvents();
    多线程
      

  6.   

    用回调
    public void Write(string info)
     {    outputRunTimeInfo = info;
                    EventHandler eh = new EventHandler(WriteLine);
                    this.Invoke(eh, new object[2] { null, null });
     }
    private void WriteLine(object sender,EventArgs e)
            {
                richTextBox_ShowInfo.Select(richTextBox_ShowInfo.Text.Length, outputRunTimeInfo.Length);
                richTextBox_ShowInfo.SelectionColor = SystemColors.WindowText;
                richTextBox_ShowInfo.Text += outputRunTimeInfo;
                richTextBox_ShowInfo.Text += "\n";
            }
      

  7.   

    我把代码贴出来,大家给我看看,主要是在程序进入方法以后我要在窗体上显示进入了方法,大家先不要管我的代码的逻辑,只要帮我实现功能吧,先谢谢了
            //按钮的事件
            private void btnStrat_Click(object sender, EventArgs e)
            {
                this.allMethod();  
            }        //程序入口
            private void allMethod() 
            {
                string str = "程序开始运行时间是:" + DateTime.Now.ToString();
                this.rtxtRizhi.AppendText(str + "\n");            //调用方法会返回一个字符串
                rizhiMethod = new S().C();
                this.GetRichText(rizhiMethod, "调用了出货指示生成: new S().C()方法;");
            }        // 在窗体上显示日志的信息
            public void GetRichText(string str,string methodName)
            {
                this.rtxtRizhi.AppendText(DateTime.Now.ToString() + methodName + "\n");
                string[] text = str.Split(//得到一个分隔符);            //改变显示操作行数的颜色
                rtxtRizhi.SelectionBullet = true;
                rtxtRizhi.SelectionFont = new Font("隶书", 12, System.Drawing.FontStyle.Regular);
                rtxtRizhi.SelectionColor = Color.Blue;
                rtxtRizhi.AppendText(text[0] + "\n");            //改变显示异常信息的颜色
                rtxtRizhi.SelectionFont = new Font("隶书", 12, System.Drawing.FontStyle.Underline);
                rtxtRizhi.SelectionColor = Color.Red;
                rtxtRizhi.AppendText(text[1] + "\n");            //让滚动条显示在最下端
                this.rtxtRizhi.ScrollToCaret();  
            }        // 类里其中一个方法,
            public string C()
            {
                log.Warn("调用了什么什么方法");     //程序走到这里也要在窗体的richtextbox里显示,调用了什么方法            //存储异常信息
                string str = "";
                int a = 0;
                try
                {
                    //正常的操作
                }
                catch (Exception e)
                {
                   //存储异常信息
                }            //操作了多少条数据
                string readly = "";
                if (a != 0)
                {
                    //记录此方法的日志信息
                    log.Error(str);
                }            // 程序运行到这里不管有没有异常都要在床体里及时的显示
                
                return readly;
            }