Подождите n секунд, затем следующая строка кода без замораживания

Привет, Я пытаюсь найти метод ожидания нескольких миллисекунд, прежде чем перейти к следующей строке кода,

Я просмотрел Thread.Sleep, но это заморозит основную форму, я бы хотел, чтобы она оставалась активной.

Я пробовал таймеры и секундомеры, и оба замораживают основную форму, когда они должны отправлять сообщения на консоль, когда они гасят.

Я не мог найти способ использования task.delay или фонового работника в ожидании, которое я тоже хотел.

Псевдокод:

Wait 2 - 6 seconds
Log "waiting"
Log "waiting"
Log "waiting"
Stop Waiting - Run next line of code.

Методы, которые я попробовал, просто заморозили форму и заполнили журнал позже, я просто хочу простой способ ожидания, не замораживая форму и не имея дело с вызываемыми событиями, что означает, что следующая строка не будет запущена,

Любая помощь была бы потрясающей, потому что я все еще новичок в С#, и это меня немного смутило: (

Ответы

Ответ 1

Ключевое слово await в сочетании с Task.Delay делает это тривиальным.

public async Task Foo()
{
    await Task.Delay(2000);
    txtConsole.AppendText("Waiting...");
    DoStuff();
}

Ответ 2

Попробуйте использовать DispatcherTimer. Это довольно удобный объект, который выполняет всю работу по делегированию потока пользовательского интерфейса.

Например:

private DispatcherTimer _dtTimer = null;

public Constructor1(){
  _dtTimer = new DispatcherTimer();
  _dtTimer.Tick += new System.EventHandler(HandleTick);
  _dtTimer.Interval = new TimeSpan(0, 0, 0, 2); //Timespan of 2 seconds
  _dtTimer.Start();
}

private void HandleTick(object sender, System.EventArgs e) {
  _uiTextBlock.Text = "Timer ticked!";
}

Ответ 3

Таймер должен работать нормально в этом случае, если вы не поместите Thread.Sleep в свой обработчик или сам обработчик занимает слишком много времени.

Вы не указали структуру пользовательского интерфейса, которую используете или .Net, но для последней .Net вы можете использовать async/wait. Таким образом, пользовательский интерфейс не будет заморожен, пока ваш код ожидает фоновой задачи.

void async MyMethod()
{  
    var result = await Task.Run(() => long_running_code);
}