C#从SQl读取时不写入rich textbox
我尝试使用以下代码清除richtextbox,从sql数据库收集数据,并通过richtextbox(rtbData)显示程序正在检索信息:C#从SQl读取时不写入rich textbox,c#,sql,richtextbox,C#,Sql,Richtextbox,我尝试使用以下代码清除richtextbox,从sql数据库收集数据,并通过richtextbox(rtbData)显示程序正在检索信息: public void readInData() { rtbData.Clear(); rtbData.AppendText("...Retrieving Data From Database..."); reader = dataCommand.ExecuteReader();
public void readInData()
{
rtbData.Clear();
rtbData.AppendText("...Retrieving Data From Database...");
reader = dataCommand.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
numbers.Add(reader.GetInt32(0).ToString());
names.Add(reader.GetString(1));
weights.Add(reader.GetDouble(2).ToString());
statuses.Add(reader.GetString(3));
times.Add(reader.GetDateTime(4).ToString());
counter++;
}
}
connection.Close();
}
但无论何时运行,richtextbox都不会清除,消息也不会出现。奇怪的是,当我在rtbData.AppendText命令的正下方插入messagebox.show()命令时,它工作正常。我尝试用thread.sleep命令替换messagebox,但没有成功。有什么想法吗?提前感谢大家。为了避免阻塞UI线程,您可以异步读取数据库:
public void readInData()
{
rtbData.Clear();
rtbData.AppendText("...Retrieving Data From Database...");
Task.Run(() =>
{
reader = dataCommand.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
numbers.Add(reader.GetInt32(0).ToString());
names.Add(reader.GetString(1));
weights.Add(reader.GetDouble(2).ToString());
statuses.Add(reader.GetString(3));
times.Add(reader.GetDateTime(4).ToString());
counter++;
}
}
connection.Close();
});
}
请记住,readDatabase可能在一个单独的线程上执行,因此您需要确保它是线程安全的。问题出在哪里还不是100%清楚。不要忘记,当代码执行SQL命令时,UI线程将很忙,因此无法更新UI;强制刷新,但根据@Daniel Kelley的回答,它不会显示主线程是否已经在忙于从SQL读取器加载数据。