显示找到的号码

时间:2015-04-02 17:19:52

标签: c# windows-phone-8

我的应用程序中有简单的任务,但我有问题。

例如:

for (int i = 1; i <= 1000000; i++)
{
    if (i % 2 == 0) {       
        TextBlock.Text += string.Format("{0},", i);
    }
}

虽然应用程序执行该任务需要很长时间,所以我希望它在找到时显示数字,而不是在最后,所有数字一起显示。 对我这样的新手来说,最简单的方法是什么? 它是WP8,C#。

非常感谢。

3 个答案:

答案 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 += ...多个结果。]