2015-04-02 2 views
-1

У меня есть простая задача в моем приложении, но у меня проблема.Показать номер как есть

Например:

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

Хотя приложение делает эту задачу он занимает много времени, поэтому я хотел бы он отображает номер, когда он находится и не в конце, все номера вместе. Что такое самый простой способ сделать это для новичков, подобных мне? Это WP8, C#.

Большое спасибо.

+0

Как-то я сомневаюсь, что вы действительно хотите распечатать 500 000 номеров на экране так быстро, как вы можете. Я не могу себе представить, как это было бы полезно для пользователя, и это наверняка закроет экран довольно долгое время, пока вы попытаетесь написать все. – Servy

+0

Я не пытаюсь отобразить все эти числа, это просто пример, мое приложение отображает несколько цифр, но расчет занимает много времени, а пользовательский интерфейс зависает. – Toni0123

+0

Так что в основном 'TextBlock.Text + = string.Format (" {0}, ", i);' ничего не делает, пока цикл не закончен? Это потому, что пользовательский интерфейс перерисовывается только ** после ** кода за стопами. – Yura

ответ

0

Вы можете продолжать добавлять эти числа в объект очереди и иметь поток, который ищет изменение в объекте очереди и одновременно обновляет текстовое поле.

0

Таким образом, проблема заключается в том, что пользовательский интерфейс не обновляется до конца цикла, даже если вы добавляете текст в TextBox. Легкий способ исправить это - добавить Application.DoEvents() звонок после TextBlock.Text += string.Format("{0},", i);. Но у этого есть некоторые критические недостатки (объяснено здесь https://stackoverflow.com/a/5183623/2152334).

Правильный путь, чтобы сделать расчет в другом потоке (с помощью задач, например) и обновления UI нить с помощью Диспетчера:

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

Вы не можете обновить экран, если ваш код блокирует поток пользовательского интерфейса. Вам нужно оставить поток пользовательского интерфейса для выполнения своей долгой задачи.

// 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); 
      }); 
     } 
    } 
}); 

Также вы можете рассмотреть вопрос о добавлении токена отмены, чтобы разорвать петлю в случае, когда пользователь покидает страница отображается.

[изменить] это решение предназначено для вашего комментария "Мое приложение покажет несколько цифр, но расчет длится долгое время". Если вам действительно нужны 1000000 результатов, попробуйте Dispatcher.InvokeAsync(...) и TextBlock.Text += ... несколько результатов одновременно.]

+0

Это просто заморозит поток пользовательского интерфейса с полмиллиона запланированных вызовов. – Servy

+0

он не замерзнет, ​​но, безусловно, будет работать очень медленно, в зависимости от машины. – Yura

+0

Я цитирую Toni0123: «* мое приложение покажет несколько цифр, но расчет займет много времени *». Таким образом, этого не будет много, и этот код должен делать. В противном случае он может выполнить несколько результатов вместе, а пакетное отобразить их 20 на 20. –

Смежные вопросы