2014-02-06 5 views
0
private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    string IDs = ID.Text; 
    string[] eachIDs = Regex.Split(IDs, "\n"); 
    foreach (var eachID in eachIDs) 
    { 
     getContent(eachID); 
     titleBox.Text = "Done"; 
    } 
} 
private void getContent(string value) 
{ 
    label1.Text = value; 
    Thread.Sleep(5000); 
} 

Я дам 4 идентификаторов, как говорят Input «IDNUMBER01, IDNUMBER02, IDNUMBER03, IDNUMBER04» каждый в новой строке в формате Rich Text Box.Отображение текущего значения переменной во время цикла

Код успешно разделяет их. Я хочу показать значение идентификатора, которое используется в текущем цикле в тексте метки.

Проблема с моим кодом показывает только последний идентификатор, который проходит через цикл.

ответ

1

Это происходит потому, что UI обновляется только после выполнения этого кода, поскольку они выполняются в той же теме. Вам нужно будет открыть поток, запустить этот код и вызвать диспетчера (или Control.BeginInvoke, если это приложение является Winforms) для обновления пользовательского интерфейса.

EDIT

Попробуйте это:

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    string IDs = ID.Text; 
    new System.Threading.Thread(() => 
    { 
     string[] eachIDs = Regex.Split(IDs, "\n"); 
     foreach (var eachID in eachIDs) 
     { 
      getContent(eachID);    
      titleBox.BeginInvoke((Action) delegate { titleBox.Text = "Done"; }); 
     } 
    }).Start(); 
} 

private void getContent(string value) 
{ 
    label1.BeginInvoke((Action) delegate { label1.Text = value; });   
    Thread.Sleep(5000); 
} 
+0

, но у меня есть проблема Отображается «Неверная операция поперечного потока: идентификатор« Контроль », доступ к которому осуществляется из потока, отличного от потока, на котором он был создан». Когда я пытаюсь отлаживать – harishannam

+0

Он показывает ту же проблему для обеих этих строк при отладке «button1.Enabled = false; string IDs = ID.Text;" – harishannam

+0

Также richTextbox получает только один DONE, даже если я передаю им три идентификатора – harishannam

2

Возможно ваш UI замораживание и вы не можете увидеть changes.Try это, используйте async/await особенность:

private async void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    string IDs = ID.Text; 
    string[] eachIDs = Regex.Split(IDs, "\n"); 
    foreach (var eachID in eachIDs) 
    { 
     await getContent(eachID); 
     titleBox.Text = "Done"; 
    } 
} 
private async Task getContent(string value) 
{ 
    label1.Text = value; 
    await Task.Delay(5000); 
} 
+0

Работает как ваше, так и решение @Guilherme. Я хочу знать, лучше ли Threading, или функция Await лучше. Можете ли вы предложить. – harishannam

+0

Ожидание работает только с .Net framework 4.5 (несовместимо с Windows XP) – Guilherme

+0

Оба имеют почти такую ​​же производительность и работают почти так же, но Thread является ручным и ожидание является автоматическим (меньше кода). – Guilherme

0

В вашем примере, вы бы лучше использовать таймер для отображения текста значения. Вы видите только последний идентификатор, потому что цикл выполняется очень быстро, и использование Thread.Sleep внутри foreach не будет летать. Вы можете использовать Application.DoEvents() перед Thread.Sleep, но таймер по-прежнему ваш лучший вариант ... имхо.

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