停止线程运行时画面会一直卡在那,除非来回切换别的程序他才会重新显示,怎么 解决?public partial class DataBaseTest : Form
    {
        State state = new State();
        Thread viewThread = null; // 在主窗口显示各种数据
        Thread validThread = null; // 验证数据任务线程
        Thread recordCountThread = null; 
        bool isLoop = true; // 线程是否继续运行        public DataBaseTest()
        {
            InitializeComponent();
        }        #region 开始测试按钮事件
        /// <summary>
        /// 开始测试按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnBeginTest_Click(object sender, EventArgs e)
        {
            state.IsLoop = isLoop;
            Task task = new Task(state);
            RecordsCountTask ct = new RecordsCountTask(state);
            
            recordCountThread = new Thread(ct.createTempTable);
            recordCountThread.Start();            validThread = new Thread(task.runTask);
            viewThread = new Thread(viewMethod);
            validThread.Start();
            viewThread.Start();
            this.BtnBeginTest.Enabled = false;
        }
        #endregion        #region 停止测试按钮事件
        /// <summary>
        /// 停止测试按钮事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnStopTest_Click(object sender, EventArgs e)
        {
            state.IsLoop = false;
            if (validThread.IsAlive)
            {
                validThread.Join();
            }
            if (viewThread.IsAlive)
            {
                viewThread.Join();
            }
            state.HadRead = 0;
            state.HadValid = 0;
            state.ValidFail = 0;
            state.ValidSuccess = 0;
            this.BtnBeginTest.Enabled = true;
        }
        #endregion
        #region 辅助线程任务:在主界面显示各种状态
        /// <summary>
        /// 辅助线程任务:在主界面显示各种状态
        /// </summary>
        private void viewMethod()
        {
            while (state.IsLoop)
            {
                Thread.Sleep(1000);
                this.Invoke(new MethodInvoker(delegate
                {
                    lock (state)
                    {
                        this.hadRead.Text = state.HadRead.ToString();
                        this.hadValidNums.Text = state.HadValid.ToString();
                        this.validSuccessNums.Text = state.ValidSuccess.ToString();
                        this.validFailNums.Text = state.ValidFail.ToString();
                    }
                }));
            }
        }
        #endregion    }public class Task
    {
        SqlCon sql = new SqlCon();
        bool isLoop = false;
        State state;
        int loadNum = 0;
        int validNum = 0;
        int count = 0;        public Task(State state)
        {
            this.state = state;
        }        public bool IsLoop
        {
            get { return isLoop; }
            set { isLoop = value; }
        }
        public void createTempTable()
        {
            sql.openLocalSqlConnect();
           count = sql.createTembTable();
           sql.closeLocalSqlConnect();
           Thread.Sleep(10000);
        }
        #region 数据库测试主方法
        /// <summary>
        /// 数据库测试主方法
        /// </summary>
        public void runTask()
        {           
            int i = 0 ;
            // 连接数据库
            sql.openLocalSqlConnect();
            sql.openRemoteSqlConnect();
            while (state.IsLoop)
            {
                if (i < state.Count)
                {
                    ++i;                    loadNum = sql.QueryLocalSqlData(i);
                    validNum = sql.ValidRemoteSqlData();
                    if (loadNum == 1)
                    {
                        state.HadRead++;
                        state.HadValid++;
                    }
                   
                    if (validNum == 1)
                    {
                        state.ValidSuccess++;
                    }
                    else
                    {
                        state.ValidFail++;
                    }
                    
                }
                else
                {
                    continue;
                }
            }
            //关闭数据库连接
            sql.closeLocalSqlConnect();
            sql.closeRemoteSqlConnect();
        }
        #endregion
    }

解决方案 »

  1.   

    #region 数据库操作模块
        /// <summary>
        /// 数据库操作模块
        /// </summary>
        public class SqlCon
        {
            SqlConnection conRemote;
            SqlConnection conLocal;
            string id = "";
            long CollectNodeId = 0;
            static string[] strLocal = { "", "", "", "" };
            static string[] strRemote = { "", "", "", "" };        public SqlCon()
            {
                this.LoadData();
            }        #region 查看数据库有多少条记录
            /// <summary>
            /// 查看数据库有多少条记录
            /// </summary>
            /// <returns></returns>
            public int createTembTable()
            {
                int count = 0;
                SqlDataReader dr = null;
                try
                {
                    string str = "SELECT COUNT(*) as totalCount FROM NowXcDataTest";
                    SqlCommand cmd = new SqlCommand(str, conLocal);
                    dr = cmd.ExecuteReader();
                    if (dr.Read())
                    {
                        count = Convert.ToInt32(dr["totalCount"].ToString().Trim());
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.StackTrace);
                }
                finally
                {
                    dr.Close();
                    
                }
                return count;
            }
            #endregion
            #region 验证数据库是否成功更新数据
            /// <summary>
            /// 
            /// </summary>
            /// <param name="m">第几行</param>
            /// <returns></returns>
            public int QueryLocalSqlData(int m)
            {
                SqlDataReader dr = null;
                int n = 0;
                try
                {
                    string str = "select CollectNodeId from NowXcDataTest WHERE id ='" + m + "'";
                    SqlCommand cmd = new SqlCommand(str, conLocal);
                    dr = cmd.ExecuteReader();
                    if (dr.Read())
                    {
                        CollectNodeId = Convert.ToInt64(dr["CollectNodeId"].ToString().Trim());
                        n = 1;
                    }
                    if (n == 0)
                    {
                        CollectNodeId = 0;
                    }
                    
                }
                catch (Exception err)
                {
                    MessageBox.Show("验证数据出错:" + err.StackTrace);
                }
                finally
                {
                    dr.Close();
                }
                return n;
            }
            #endregion        #region 验证数据库是否成功更新数据
            /// <summary>
            /// 验证数据库是否成功更新数据
            /// </summary>
            /// <param name="CollectNodeId"></param>
            public int ValidRemoteSqlData()
            {
                int n = 0;
                SqlDataReader dr = null;
                try
                {
                    //this.openRemoteSqlConnect();
                    string str = "SELECT COUNT(*) as totalCount FROM NowXcDataTest nx WHERE nx.CollectNodeId='" + CollectNodeId + "'";
                    SqlCommand cmd = new SqlCommand(str, conRemote);
                    dr = cmd.ExecuteReader();
                    if (dr.Read())
                    {
                        id = dr["totalCount"].ToString();
                    }
                    if ("1".Equals(id))
                    {
                        n = 1;
                    }
                }
                catch (Exception err)
                {
                    MessageBox.Show("验证数据出错:" + err.StackTrace);
                }
                finally
                {
                    dr.Close();
                }
                return n;
            }
            #endregion        #region 打开远程数据库连接
            /// <summary>
            /// 打开远程数据库连接
            /// </summary>
            public void openRemoteSqlConnect()
            {
                try
                {
                    string str = @"data source=" + strRemote[0] + ";initial catalog=" + strRemote[1] + ";uid=" + strRemote[2] + ";pwd=" + strRemote[3];
                    this.conRemote = new SqlConnection(str);
                    this.conRemote.Open();            }
                catch (Exception e)
                {
                    MessageBox.Show("连接数据库出错:" + e.StackTrace);
                }
            }
            #endregion        #region 关闭远程数据库连接
            /// <summary>
            /// 关闭远程数据库连接
            /// </summary>
            ///
            public void closeRemoteSqlConnect()
            {
                this.conRemote.Close();
            }
            #endregion
            #region 打开本地数据库连接
            /// <summary>
            /// 打开数据库连接
            /// </summary>
            public void openLocalSqlConnect()
            {
                try
                {
                    string str = @"data source=" + strLocal[0] + ";initial catalog=" + strLocal[1] + ";uid=" + strLocal[2] + ";pwd=" + strLocal[3];
                    conLocal = new SqlConnection(str);
                    conLocal.Open();
                }
                catch (Exception e)
                {
                    MessageBox.Show("连接数据库出错:" + e.StackTrace);
                }
            }
            #endregion        #region 关闭本地数据库连接
            /// <summary>
            /// 关闭数据库连接
            /// </summary>
            ///
            public void closeLocalSqlConnect()
            {
                conLocal.Close();
            }
            #endregion        #region 文件读取数据库配置信息
            /// <summary>
            /// 从本地XML文件读取数据库配置信息
            /// </summary>
            public void LoadData()
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    // 装入指定的XML文档 
                    doc.Load("LocalSqlXml.xml");
                    // 设定XmlNodeReader对象来打开XML文件 
                    XmlNodeReader reader = new XmlNodeReader(doc);
                    // 读取XML文件中的数据,并显示出来 
                    string s = "";
                    while (reader.Read())
                    {
                        //判断当前读取得节点类型 
                        switch (reader.NodeType)
                        {
                            case XmlNodeType.Element:
                                s = reader.Name;
                                break;
                            case XmlNodeType.Text:
                                if (s.Equals("address"))
                                    strLocal[0] = reader.Value;
                                if (s.Equals("db"))
                                    strLocal[1] = reader.Value;
                                if (s.Equals("uid"))
                                    strLocal[2] = reader.Value;
                                if (s.Equals("pwd"))
                                    strLocal[3] = reader.Value;
                                break;
                        }
                    }                reader.Close();                //读取远程数据库配置
                    XmlDocument docs = new XmlDocument();
                    docs.Load("RemoteSqlXml.xml");
                    XmlNodeReader readers = new XmlNodeReader(docs);
                    // 读取XML文件中的数据,并显示出来 
                    string ss = "";
                    while (readers.Read())
                    {
                        //判断当前读取得节点类型 
                        switch (readers.NodeType)
                        {
                            case XmlNodeType.Element:
                                ss = readers.Name;
                                break;
                            case XmlNodeType.Text:
                                if (ss.Equals("address"))
                                    strRemote[0] = readers.Value;
                                if (ss.Equals("db"))
                                    strRemote[1] = readers.Value;
                                if (ss.Equals("uid"))
                                    strRemote[2] = readers.Value;
                                if (ss.Equals("pwd"))
                                    strRemote[3] = readers.Value;
                                break;
                        }
                    }
                    readers.Close();
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.StackTrace);
                }
            }
            #endregion
        }
        #endregionpublic class State
        {
            int hadRead;
            int hadValid;
            int validSuccess;
            int validFail;
            bool isLoop;
            int count;        public bool IsLoop
            {
                get { return isLoop; }
                set { isLoop = value; }
            }        public int Count
            {
                get { return count; }
                set { count = value; }
            }        public int HadRead
            {
                get { return hadRead; }
                set { hadRead = value; }
            }
            public int HadValid
            {
                get { return hadValid; }
                set { hadValid = value; }
            }
            public int ValidSuccess
            {
                get { return validSuccess; }
                set { validSuccess = value; }
            }
            public int ValidFail
            {
                get { return validFail; }
                set { validFail = value; }
            }    }
      

  2.   

     /*******************************************************
        * 主要用于保存查询数据库记录数
        *******************************************************/
        public class RecordsCountTask
        {
            State state;
            SqlCon sql = new SqlCon();
            int count; // 数据库表的记录数        public RecordsCountTask(State state)
            {
                this.state = state;
            }        #region 定时检查数据库有多少条数据
            /// <summary>
            /// 定时检查数据库有多少条数据
            /// </summary>
            public void createTempTable()
            {
                try
                {
                    while (state.IsLoop)
                    {
                        sql.openLocalSqlConnect();
                        count = sql.createTembTable();
                        sql.closeLocalSqlConnect();
                        lock (state)
                        {
                            state.Count = count;
                        }
                        int n = 0;
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.StackTrace);
                }
            }
            #endregion
        }
      

  3.   

    你那个private void viewMethod()还不如用WinForm Timer。