2010-08-24 3 views
1

Yay Я, наконец, подумал о названии!Код перед циклом foreach не выполняется

У меня есть цикл foreach, который выполняет итерацию ListViewItems и делает что-то с каждым элементом. Но проблема заключается не в том, что он не выполняет работу в цикле, а просто не выполняет код, который появляется до цикла foreach.

Ниже приводится полный метод:

private void pNGToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
      stat.Text = "Converting to PNG."; 
      _piclist.Enabled = false; 

      foreach (ListViewItem item in _piclist.Items) 
      { 
       try 
       { 
        /* magical image conversion here. */ 
        _piclist.Enabled = true; 
         stat.Text = 
          "Conversion complete."; 

       } 
       catch (Exception exception) 
       { 
        stat.Text = 
         exception.Message; 

       } 
      } 
    } 

Может кто-то пожалуйста, помогите мне понять, почему код:

stat.Text = "Converting to PNG."; 
      _piclist.Enabled = false; 

перед циклом Еогеасп никогда не запускается на выполнение?

Благодаря

+0

Вы прошли через код в отладчике, чтобы подтвердить, что он не выполняется. На самом деле может быть, что текстовое поле не обновляется. –

+1

Поскольку вы управляете теми же переменными внутри цикла, что вы установили значения в вне цикла, уверены ли вы, что это не первая итерация цикла, которая фактически меняет их, создавая впечатление, что она никогда не исполнялась? – InSane

+0

@Matt: Это toolStripLabel, что я редактирование и yep, я прошел через код. – 2010-08-24 10:43:34

ответ

4

Он делает. Дело в том, что тело вашего цикла сразу переписывает результаты кода, который выполнялся до:

stat.Text = "Converting to PNG."; 
      _piclist.Enabled = false; 

      _piclist.Enabled = true; 
       stat.Text = 
        "Conversion complete."; 

Вы не видите, потому что UI застывает в то время как ваш метод выполнения, и вы видите только последние изменения. Рассмотрите возможность использования потоков, отличную статью здесь: http://msdn.microsoft.com/en-us/magazine/cc164037.aspx

+0

Ah. Это объясняет это. Но я не понимаю, почему он перезаписывает его до завершения преобразования изображения. Между первым сообщением о состоянии и вторым есть 15 секунд. – 2010-08-24 10:40:37

+1

@ j-t-s, если вы выполняете длительные действия в обработчиках событий (что само по себе плохо), ваш пользовательский интерфейс зависает до тех пор, пока выполнение не покинет метод. поэтому изменение произойдет, но вы не увидите его, потому что пользовательский интерфейс не обновляется. Рассмотрим использование потоков. – Andrey

+0

Спасибо, Андрей!Раньше я использовал потоки для длительных действий, связанных с обновлением пользовательского интерфейса, но остановился, потому что я устал от людей, говорящих: «Почему вы используете потоки для этого !! ???», что заставило меня предположить, что я делал что-то неправильно, и поскольку я не мог подкрепить мои причины использования потоков, я должен был предположить, что они были правы. – 2010-08-24 10:53:52

0

Похоже, вы не зарегистрировали обработчик с событием ... (+ =)

Martin

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

+0

«Но проблема не в том, что он не выполняет работу в цикле, а просто не выполняет код, который появляется перед циклом foreach». - Вызывается вызов цикла foreach. И событие было зарегистрировано, но спасибо вам все равно :) – 2010-08-24 10:48:48

+0

Извините - я подумал, что когда вы сказали, что строки не выполнялись, вы бы проверили это с точкой останова ... –

3

Как вы подтвердили, что код не был выполнен? Вы установили точку останова?

Как только цикл Еогеасп будет введен, _piclist.Enabled и stat.Text значения, установленные до петли заменяются новыми значениями (до true и "Conversion complete". Вероятно, пользовательский интерфейс никогда не обновляется в среднем раз.

+0

Я установил точку останова и прошел через код во время отладки, и первый stat.Text никогда не отображается. Я думаю, вы правы в том, что интерфейс не обновляется. Как я могу убедиться, что он обновляется, когда мне это нужно? Или это должен быть отдельный вопрос? – 2010-08-24 10:50:18