2016-10-20 3 views
0

Я создаю программу, в которой данные заполняются в список. Когда я нажимаю флажок в цикле, он должен начинаться с самого начала. Когда я нажимаю флажок, он не проверяет, и это также мешает мне щелкнуть что-нибудь еще из-за бесконечного цикла. Кто-нибудь знает решение вокруг этого?Использование флажка для цикла

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    while(checkBox1.Checked == true) 
    { 
     Play(); 
    } 
} 
+0

WinForms? ASP.NET? Что-то другое? – Tim

+0

Я думаю, вам нужно использовать if block вместо блока. Я предполагаю, что ваш цикл находится в методе Play(). – Jayee

+0

Извините, Winforms. –

ответ

0

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

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
{ 
    while(checkBox1.Checked == true) 
    { 
     Play(); 
     Application.DoEvents(); 
    } 
} 

DoEvents вызывает окна для обработки сообщений (например, вход UI), которые в настоящее время в очереди сообщений. Без него оконные сообщения никогда не обрабатываются, потому что Play находится в потоке пользовательского интерфейса, и у насоса сообщений никогда не будет возможности запускать, поэтому, даже если вы неистово нажимаете на этот флажок, окна никогда не смогут сообщить об этом вашему приложению.

Существует множество способов сделать это с помощью Play на фоне. Эти примеры немного более востребованы, чем подход DoS-сообщений на основе сообщений.

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

0

Я выполнил реализацию на основе параллельной библиотеки задач (TPL). TPL теперь представляет собой дефакто-многопоточную парадигму, рекомендованную Microsoft. Специально TPL лучше всего поддерживать отзывчивость пользовательского интерфейса при выполнении другой работы в фоновом режиме. Ниже приведен фрагмент кода для этого же номера:

private void checkBox1_CheckedChanged(object sender, EventArgs e) 
    { 
     if (checkBox1.Checked == true) 
     { 
      //iterate list box items on a thread-pool thread using TPL 
      Task.Run(() => Play()); 
     } 
    } 

    private void Play() 
    { 
     //listBox1 is the name of the list box control in my windows forms application 
     foreach (var listboxItem in listBox1.Items) 
     { 
      //check if the checkbox is currently in checked state 
      if(checkBox1.Checked) 
      { 
       //Checkbox is checked so process the listbox item 
       Console.WriteLine(listboxItem.ToString()); 
       //do other required stuff 
      } 
      else 
      break;  
     } 

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