C# 显示找到的号码

C# 显示找到的号码,c#,windows-phone-8,C#,Windows Phone 8,我的应用程序中有一个简单的任务,但我有问题 例如: for (int i = 1; i <= 1000000; i++) { if (i % 2 == 0) { TextBlock.Text += string.Format("{0},", i); } } 用于(int i=1;i您可以在队列对象中不断添加这些数字,并让一个线程查找队列对象中的更改,同时更新文本框。因此,问题是,在循环结束之前,UI不会刷新,即使您将文本添加到文本框中。修复它

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

例如:

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

用于(int i=1;i您可以在队列对象中不断添加这些数字,并让一个线程查找队列对象中的更改,同时更新文本框。

因此,问题是,在循环结束之前,UI不会刷新,即使您将文本添加到文本框中。修复它的简单方法是添加
应用程序。DoEvents()
TextBlock.Text+=string.Format(“{0},”,i)之后调用;
。 但它有一些严重的缺点(在这里解释)

正确的方法是在不同的线程中进行计算(例如使用任务),并使用Dispatcher更新UI线程:

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
   TextBlock.Text += ...
});

如果代码阻塞了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);
            });
        }
    }
});
//我们转到非UI线程
TaskEx.Run(()=>{

对于(int i=1;不知何故,我怀疑你是否真的想尽可能快地在屏幕上打印500000个数字。我无法想象这对用户会有多大帮助,当你试图将它们全部打印出来时,它肯定会在相当长的一段时间内锁定屏幕。我并不是想显示所有这些数字,只是举个例子,我的应用程序将显示的数字很少,但计算时间很长,用户界面冻结。因此基本上
TextBlock.Text+=string.Format(“{0},”,i)
在循环完成之前不会执行任何操作?这是因为UI只有在代码隐藏停止执行后才会重新绘制。然后给出一个与您的情况更为相似的示例。在这个示例中,计算数据基本上不需要任何时间,问题源于您拥有的数据量。显示一个小结果从长时间运行的计算中得到的t是一个要解决的简单得多的问题。好吧,假设我需要,正如我在第一篇文章中所写的。我需要一个接一个地显示500000个数字。这将冻结具有50万次计划调用的UI线程。它不会冻结,但肯定会执行得非常慢,具体取决于机器。我引用Toni0123:“我的应用程序将显示很少的数字,但计算需要很长时间”。因此不会有这么多数字,这段代码应该可以。否则,他可以将一些结果合并在一起,并以20乘20的方式批量显示。@Yura它将阻止除此之外的任何UI事件被处理,直到它们全部完成(这可能需要一些时间)是的,它会冻结。@Servy不是真的。记住,我们谈论的是长操作,而不仅仅是这个
if(i%2==0)