我正在使用Visual C#2013创建一个win-forms应用程序。由于必须在表格中的多行数据上执行大量计算,因此我有一个循环需要一分钟才能完成,因此当用户等待我显示“加载...”形式时。
在此表单上,我希望显示行数的倒计时,因此用户可以查看剩余的数据行数,但是打开此数字的标签不会像所有内容一样更新冻结'直到循环结束。
System.Windows.Forms.Form f = System.Windows.Forms.Application.OpenForms["LoadingForm"];
int DataRowsRemaining = TotalRowCount;
for (int i=0; i<=TotalRowCount; i++)
{
//CALCULATION CODE
((LoadingForm)f).label1.Text = Convert.ToString(DataRowsRemaining--);
}
此代码不允许标签在循环期间更新。使用,Application.DoEvents();在标签允许更新之后,这也刷新了表单上的所有其他标签,这显着减慢了计算速度,因此我认为我需要允许在一个单独的线程上执行这一行代码。
由于我对这个问题的了解有限,任何人都可以告诉我多线程技术是否是解决这个问题的最佳方法,如果有的话,我是如何编写代码的,因为我一直在努力了解多线程的在线示例。
感谢您的时间,Aaron。
答案 0 :(得分:4)
最简单的方法是
await Task.Run(() => { /* CALCULATION CODE */ });
private async void Calculation()
{
for (int i = 0; i <= TotalRowCount; i++)
{
await Task.Run(() => { /* CALCULATION CODE */ });
((LoadingForm)f).label1.Text = Convert.ToString(DataRowsRemaining--);
}
}
答案 1 :(得分:-1)
关于如何使用.Invoke()
,有一个示例here in MSDN。但是,L.B的答案可能要简单得多。