停止线程运行时画面会一直卡在那,除非来回切换别的程序他才会重新显示,怎么 解决?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
}
{
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
}
/// <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; }
} }
* 主要用于保存查询数据库记录数
*******************************************************/
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
}