日期:2014-05-18  浏览次数:20986 次

如何监控多线程执行状态
如题。
我的方法是给线程一个回调方法往一个richtextbox来输出线程状态
但是发现多线程执行的时候,多个线输出信息时非常容易出错。
加一个全局的静态变量做锁的话,程序基本没办法输出信息,死锁状态。
不知应如何处理,请大家指点一二。
回调方法如下:
private   static   object   lockobj;
#region   private   void   OnOutputRunInfo(string   Message)     //信息输出到控制台
                ///   <summary>
                ///   信息输出到控制台
                ///   </summary>
                ///   <param   name= "Message "> </param>
                private   void   OnOutputRunInfo(string   Message)
                {
                       
                        //lock   (lockobj)
                        //{
                        //         rtbCenter.Text   +=   Message   +   "\r\n "   +   rtbCenter.Text;
                        //         rtbCenter.Focus();
                        //         rtbCenter.Select(this.rtbCenter.TextLength,   0);
                        //         rtbCenter.ScrollToCaret();
                        //}

                        //rtbCenter.Text   +=   Message;
                        //rtbCenter.Text   +=   "\r\n ";
                        //rtbCenter.Select(rtbCenter.Text.Length,   0);
                        //rtbCenter.ScrollToCaret();
                }  
                #endregion

------解决方案--------------------
具体代码才知晓

//这句不好,用AppendText方法好点
rtbCenter.Text += Message + "\r\n " + rtbCenter.Text;

------解决方案--------------------
使用backgroundWoker类
------解决方案--------------------
这个涉及到多线程之间的数据传输问题了.
用这个函数 this.BeginInvoke ().再用这个函数前,必须先声明一个委托.delegate类型.

1.private delegate void UpdateWatchRichtextDelegate(string newtext);当然名字你自己随便自己取都行.

2.在实现UpdateWatchRichtext(string newtext)//newtext是线程间传输的数据.
{
//比如:这样就可以数据传出来.
txtRichTxt.Text+=newtext;
}

3.在需要把数据传送到RichText时,就调用
this.BeginInvoke(new UpdateRichTextDelegate(UpdateWatchRichtext),string trData)
//strData在这里为传送的数据.
这样就能实现了.

若还不明白给我邮,我有这样程序.

------解决方案--------------------
使用一個狀態管理的結構或者類,這樣比較方便管理線程.