vinodh muthusamy Ответов: 3

Таймер времени ожидания


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

for (int i = j; i <= ds.Tables[0].Rows.Count; i++)
           {
                   string Sname = ds.Tables[0].Rows[i][SB].ToString();
                   txt_TextBox1.Text = Sname.ToString();
                   txt_TextBox1.Focus();
              // Delay Time Which I have taken from Input User- 8000 MilliSeconds
               Task.Delay(Convert.ToInt32(Stimer));
             }


Что я уже пробовал:

Я сделал текстовое поле сфокусированным. Но он существует быстро из цикла.

Andy Lanng

Почему вы устанавливаете задержку в цикле? Не имеет значения, сколько раз вы устанавливаете его на [8000], он все равно будет 8000 с самого начала, а не с момента установки.
Поразмыслив, я могу ошибаться

3 Ответов

Рейтинг:
2

Philippe Mori

Вызов ToString() после Sname совершенно бесполезно, так как у вас уже есть string.

Не имеет большого смысла фокусировать внимание на элементе управления внутри цикла.

Ваши переменные неправильно названы в соответствии с.Чистая конвенция. Переменные должны начинаться со строчной буквы.

Ваше имя переменной не является описательным.

Как правило, лучше использовать int.TryParse (Типа int32.Метод TryParse (Система)[^]) для преобразования строки в целое число.

Нет особого смысла напрямую иметь задержку внутри потока пользовательского интерфейса, так как приложение перестанет отвечать. Было бы неплохо ознакомиться с документацией: Задача.Метод Задержки (TimeSpan) (System.Нарезание резьбы.Задачи)[^]. Вероятно, вам следует использовать await ключевое слово, как в примере, чтобы поток пользовательского интерфейса не был заблокирован.

Также проверьте версию, которая принимает целое число, так как она дает некоторую дополнительную информацию об использовании await: Задача.Метод Задержки (Int32) (System.Нарезание резьбы.Задачи)[^].

См. Также этот код: TechNet Wiki[^]

Некоторые дополнительные ссылки:
Не блокируйте асинхронность и ожидание[^]
Будет ли он блокировать? Развенчание асинхронных / ожидающих ловушек-путешествие кода[^]


Рейтинг:
1

Ralf Meier

Попробуйте вот так :

private int cnt = 0;

private void TimerMethod()
{
    string sname = ds.Tables[0].Rows[i][SB].ToString();
    txt_TextBox1.Text = sname;

    cnt += 1;
    if (cnt > ds.Tables[0].Rows.Count) { cnt = 0; }
}


... и вызовите этот Timer-метод по таймеру.ТИК (назначение метода к данному мероприятию)
Также вы должны установить время задержки для актуализации внутри таймера-Intervall (свойство таймера)


Дополнительный:
Если вы хотите, чтобы ваше текстовое поле было активным, вы должны использовать TextBox.Select вместо TextBox.Сосредоточить.


Рейтинг:
0

Karthik_Mahalingam

Последовать этому примеру

async Task MyDelay(int time)
       {
           await Task.Delay(time);
       }

       private async void button1_Click(object sender, EventArgs e)
       {
           int delayinMilliSec = 1000; // 1 second delay
           for (int i = 0; i < 10; i++)
           {
               txt_TextBox1.Text = i.ToString();
               txt_TextBox1.Focus();
               await MyDelay(delayinMilliSec);
           }

       }


передано от Нить.Сон и Задача.Задержка [^]

В вашем коде
for (int i = j; i <= ds.Tables[0].Rows.Count; i++)


<= результаты в исключении индекса,
string Sname = ds.Tables[0].Rows[i][SB].ToString();

всегда использовать