我的应用程序中有简单的任务,但我有问题。
例如:
for (int i = 1; i <= 1000000; i++)
{
if (i % 2 == 0) {
TextBlock.Text += string.Format("{0},", i);
}
}
虽然应用程序执行该任务需要很长时间,所以我希望它在找到时显示数字,而不是在最后,所有数字一起显示。 对我这样的新手来说,最简单的方法是什么? 它是WP8,C#。
非常感谢。
答案 0 :(得分:0)
您可以继续在队列对象中添加这些数字,并让线程在队列对象中查找更改并同时更新文本框。
答案 1 :(得分:0)
所以问题是,即使你将文本附加到TextBox,UI也不会刷新,直到你的循环结束。解决问题的简便方法是在Application.DoEvents()
之后添加TextBlock.Text += string.Format("{0},", i);
来电。
但它有一些关键的缺点(在此解释https://stackoverflow.com/a/5183623/2152334)。
正确的方法是在不同的线程中进行计算(例如使用Tasks)并使用Dispatcher更新UI线程:
Deployment.Current.Dispatcher.BeginInvoke(() =>
{
TextBlock.Text += ...
});
答案 2 :(得分:0)
如果您的代码阻止了UI线程,则无法刷新显示。你需要离开UI线程来完成长期任务。
// We go to a non-UI thread
TaskEx.Run(() => {
for (int i = 1; i <= 1000000; i++)
{
// some long operation here... -_-"
if (i % 2 == 0)
{
// We return to UI thread after long operation to display the result
Deployment.Current.Dispatcher.InvokeAsync(() => {
TextBlock.Text += string.Format("{0},", i);
});
}
}
});
另外,您可以考虑添加取消令牌以在用户离开正在显示的页面时中断循环。
[编辑:此解决方案适用于您的评论&#34; 我的应用程序将显示少量数字,但计算需要很长时间&#34;。如果您确实需要1000000个结果,请一次尝试Dispatcher.InvokeAsync(...)
和TextBlock.Text += ...
多个结果。]