Бесконечный цикл, который будет выполняться на основе времени
Я довольно новичок в программировании, поэтому любая помощь будет приниматься на борт, я пытаюсь запускать свой CreateTable каждые 2 секунды, однако, когда я нажимаю кнопку для запуска InitLoop, ничего не происходит, я пробовал разные вещи, но не был в состоянии заставить это работать успешно.
private void CreateTable()
{
//Set the number of columns and rows
int tblColumns = 20;
int tblRows = 50;
//Create the table
Table tbl = new Table();
tbl.CssClass = "table";
//Add table
PlaceHolder1.Controls.Add(tbl);
Random RandomNumber = new Random();
for (int i = 0; i < tblRows; i++)
{
TableRow tr = new TableRow();
for (int j = 0; j < tblColumns; j++)
{
TableCell tc = new TableCell();
int Range = RandomNumber.Next(1, 99);
tc.Text = Range.ToString();
//Add Columns
tr.Cells.Add(tc);
}
//Add Rows
tbl.Rows.Add(tr);
}
return;
}
System.Timers.Timer myTimer = new System.Timers.Timer();
private void InitLoop(bool runLoop)
{
while (true)
{
try
{
myTimer.Elapsed += myTimer_Elapsed;
myTimer.Interval = 2000;
myTimer.Enabled = true;
myTimer.Start();
}
catch (Exception f)
{
//handle the exception
}
}
}
private void myTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
CreateTable();
}
2 ответа
Таймер - это все, что вам нужно. Бесконечный цикл быстро сбрасывает таймер, поэтому ничего не происходит.
private void InitLoop(bool runLoop)
{
try
{
myTimer.Elapsed += myTimer_Elapsed;
myTimer.Interval = 2000;
myTimer.Enabled = true;
myTimer.Start();
}
catch (Exception f)
{
//handle the exception
}
}
как правило, вам не нужен бесконечный цикл без какой-либо команды thread.sleep(), поскольку он также доводит процессор до 100%, пытаясь выполнить цикл максимально быстро.
Обратные вызовы происходят, но, скорее всего, метод CreateTable выдает исключение. Причиной исключения является то, что метод пытается изменить объект графического интерфейса. Чтобы изменить такой объект, вы должны быть в потоке графического интерфейса. То, что вам нужно искать, это Dispatcher, и как отправлять обратные вызовы.
Проверьте, добавив try-catch к методу обратного вызова таймера и отладив, или запишите исключение в файл журнала или тому подобное.