Ответ 1
Ключевое слово await
в сочетании с Task.Delay
делает это тривиальным.
public async Task Foo()
{
await Task.Delay(2000);
txtConsole.AppendText("Waiting...");
DoStuff();
}
Я просмотрел Thread.Sleep, но это заморозит основную форму, я бы хотел, чтобы она оставалась активной.
Я пробовал таймеры и секундомеры, и оба замораживают основную форму, когда они должны отправлять сообщения на консоль, когда они гасят.
Я не мог найти способ использования task.delay или фонового работника в ожидании, которое я тоже хотел.
Псевдокод:
Wait 2 - 6 seconds
Log "waiting"
Log "waiting"
Log "waiting"
Stop Waiting - Run next line of code.
Методы, которые я попробовал, просто заморозили форму и заполнили журнал позже, я просто хочу простой способ ожидания, не замораживая форму и не имея дело с вызываемыми событиями, что означает, что следующая строка не будет запущена,
Любая помощь была бы потрясающей, потому что я все еще новичок в С#, и это меня немного смутило: (
Ключевое слово await
в сочетании с Task.Delay
делает это тривиальным.
public async Task Foo()
{
await Task.Delay(2000);
txtConsole.AppendText("Waiting...");
DoStuff();
}
Попробуйте использовать 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!";
}
Таймер должен работать нормально в этом случае, если вы не поместите Thread.Sleep в свой обработчик или сам обработчик занимает слишком много времени.
Вы не указали структуру пользовательского интерфейса, которую используете или .Net, но для последней .Net вы можете использовать async/wait. Таким образом, пользовательский интерфейс не будет заморожен, пока ваш код ожидает фоновой задачи.
void async MyMethod()
{
var result = await Task.Run(() => long_running_code);
}