我在表单上创建了一个文本框,让用户知道他们发起的程序的状态。在此tb中显示的第一个值是"计算报告..."。在此过程中,此字段总共更新3次,但只有最终值最终可见。
private void bRun_Click(object sender, EventArgs e)
{
tRunTime.Text = "Calculating report...";
SqlConnection conn = new SqlConnection(connection);
conn.Open();
this.Cursor = Cursors.WaitCursor;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
using (conn)
{
try
{
//my code...
}
catch (Exception r)
{
MessageBox.Show("Error: " + r, "Report Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
tRunTime.Text = "Calculation complete. Exporting to Excel...";
string sqlReport = "my sql string";
//Populate dataset
SqlDataAdapter adapterReport = new SqlDataAdapter(sqlReport, conn);
DataSet dsReport = new DataSet();
dsReport.Tables.Add(sqlReport);
adapterReport.Fill(dsReport, sqlReport);
ExportDataSetToExcel(sqlReport); // Local custom process that I use on many forms. It works perfectly.
Process.Start(@"path to temp file");
}
conn.Close();
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
tRunTime.Text = "Report run time: " + elapsedTime;
this.Cursor = Cursors.Default;
}
除了前两个状态阶段("计算报告......""计算完成。导出到Excel ...")之外,此处的所有内容都完美无缺。在表格上。
我对C#有些新意,所以如果你看到我对代码的其他改进,我也很满意。
提前致谢!
答案 0 :(得分:1)
UI是单线程的,因此在长时间运行的任务中不会完全响应。
尝试使用BackgroundWorker
或其他Thread
代表。两者都应该允许多线程访问UI。