我的UI上有一个按钮和一个标签。当我点击按钮时,我想在标签上显示"进行中",直到for循环结束,然后相同的标签应该再次显示收集的结果。
private void button1_Click(object sender, RoutedEventArgs e)
{
label1.Content = "In progress..";
List<string> intList = new List<string>();
for (long i = 0; i <= 50000000; i++)
{
intList.Add("Test");
}
label1.Content = intList.ToString();
}
您需要将工作转移到后台线程,否则您的循环将在UI线程上继续,因此您看不到"进度"。
您可以使用BackgroundWorker或Task来完成此任务:
private void button1_Click(object sender, RoutedEventArgs e)
{
label1.Content = "In progress..";
Task.Factory.StartNew<List<string>>(
() =>
{
List<string> intList = new List<string>();
for (long i = 0; i <= 50000000; i++)
{
intList.Add("Test");
}
return intList;
})
.ContinueWith(
(t) => label1.Content = t.Result.ToString(),
TaskScheduler.FromCurrentSynchronizationContext());
}
使用后台工作人员来完成实际工作(for循环),并在函数完成时订阅他引发的事件。你也可以检查进度等,以获得更有价值的进度表。
您应该使用BackgroundWorker来完成此操作。这似乎是一个很好的例子来说明如何做到这一点。http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/