等到任务在循环内完成,然后再执行下一行代码

时间:2014-02-28 16:49:47

标签: c# multithreading

我正在使用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。

2 个答案:

答案 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的答案可能要简单得多。