2016-11-22 1 views
-1

Это образец моего кода. Я хочу иметь 3-секундную задержку перед тем, как выполнить следующий случай (отобразить иллюстрацию). Но когда я попытался использовать таймер/секундомер, 3-секундная задержка будет только на 1-м случае, а case2 будет выполняться одновременно с case1 (без задержки).Как вы делаете паузу между случаями в операторах switch? C#. 3-секундная задержка перед выполнением следующего случая

private void button1_Click(object sender, EventArgs e) 
{ 
    string input = (input1.Text).ToString(); 
    char[] letters = input.ToCharArray(); 
    int stringlength = letters.Length; 
    int length = stringlength - 1; 

    int state = 1; 
    int position = 0; 
    string validation = " "; 


    switch (state) 
    { 
     case 1: 
      //insert timer here 
      if (letters[position] == 'a') 
      { 

       pictureBox2.Visible = true; 
       validation = "Invalid"; 
       label1.Text = validation; 
       break; 
      } 
      else if (letters[position] == 'b') 
      { 
       if (position == length) 
       { 
        validation = "Invalid"; 
        label1.Text = validation; 
        break; 
       } 
       pictureBox2.Visible = true; 
       position = position + 1; 
       goto case 2; 
      } 
      break; 

     case 2: 
      //Insert Timer here 
      if (letters[position] == 'a') 
      { 
       pictureBox3.Visible = true; 
       if (position == length) 
       { 
        validation = "Invalid because it does not end at final state"; 
        label1.Text = validation; 
        break; 
       } 
       position = position + 1; 
       goto case 3; 
      } 
      else if (letters[position] == 'b') 
      { 
       if (position == length) 
       { 
        validation = "Invalid"; 
        label1.Text = validation; 
        break; 
       } 

       position = position + 1; 
       goto case 4; 
      } 
      break; 
    } 

} 

Кстати, я не могу использовать Task.Delay или async/await потому что я использую 4.0 .NET.

+3

Не используйте 'goto', пожалуйста. –

+1

Помимо «goto» в коммутационном футляре, почему бы вы поместить паузу (тогда таймер) в каждом случае? «Состояние» уже оценивается в 'switch', и бесполезно ставить таймер в каждом случае, поэтому, возможно, вы поставили его перед оператором' switch'. –

ответ

0

Вы можете выполнить это с помощью:

System.Threading.Thread.Sleep(3000); 

Так Ваш код должен выглядеть следующим образом:

private void button1_Click(object sender, EventArgs e) 
{ 
    int state = 1; 
    //some code 


    switch (state) 
    { 
     case 1: 
     System.Threading.Thread.Sleep(3000); 
     //some case code 
     break; 
     case 2: 
     System.Threading.Thread.Sleep(3000); 
     //some case code 
     break; 
     default: 
     System.Threading.Thread.Sleep(3000); 
     //some default code 
     break; 
    } 
    //rest of the code 
} 

Просто, чтобы вы знаете, там должны быть и другие (и лучше) способ прохождения это вместо того, чтобы использовать этот переключатель и этот тип GOTO. В будущем код не читается.

+2

Просто обратите внимание, что Thread.Sleep() заблокирует весь поток, если это ваш UI.thread, например, ваше приложение будет чувствовать, что оно заморожено в течение этих 3 секунд сна. Если это то, что хочет @Kate Lastimosa, она может использовать Thread.Sleep(), если не идея таймера была лучше подходит. –

-1

Thread.Sleep(3000) Вы можете использовать

+0

После каждого случая у вас есть Thread.Sleep (3000) –

+4

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Также попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! – kayess

+0

в чем причина пониженного голосования. Ясно, что я упомянул в комментариях после того, как case statement op должен использовать Thread.Sleep –

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