Я делаю небольшую игру с функцией автоматического запуска, но программа работает слишком быстро, поэтому пользователь не может видеть результат на каждом этапе. Я использую VS 2017, поэтому я не могу использовать async (по крайней мере из того, что я прочитал). Как я могу заставить программу ждать и позволить обновлять интерфейс?
Я работаю в цикле do while. Основной блок игры выполняется, обновляет пользовательский интерфейс, а затем ждет, когда игрок нажмет кнопку (при условии, что автоматическое воспроизведение не запущено), при этом автоматическое воспроизведение запускает цикл do while, но после обновления пользовательского интерфейса он будет ждать X секунд .
0
Matthew Tomlin
31 Авг 2017 в 16:40
4 ответа
Лучший ответ
Похоже, у вас есть несколько вариантов
1.Вы можете попробовать Sleep - (но он может повесить интерфейс)
int Seconds = 1;
Threading.Thread.Sleep(Seconds * 1000);
2.Вы можете попробовать этот код:
int Seconds = 1;
Private void WaitNSeconds(int seconds)
{
if (seconds < 1) return;
DateTime _desired = DateTime.Now.AddSeconds(seconds);
while (DateTime.Now < _desired) {
System.Windows.Forms.Application.DoEvents();
}
}
3. Попробуйте использовать Async и посмотрите, что произойдет
async Task MakeDelay() {
await Task.Delay(5000);
}
private async void btnTaskDelay_Click(object sender, EventArgs e) {
await MakeDelay();
}
-1
Ess Kay
31 Авг 2017 в 14:04
Вы можете использовать async / await, чтобы замедлить выполнение обработчика событий, не разбивая логику. Это довольно просто:
async void Button_Click(object sender, RoutedEventArgs e) // wpf event handler
{
...
await Task.Delay(1000); // pause 1 second
...
while (someCondition)
{
...
await Task.Delay(1000);
...
}
}
Вы можете прочитать о async
/ await
на msdn.
Если вы используете WPF, вам нужно заглянуть в
0
Sinatr
31 Авг 2017 в 13:58
Функция ожидания с использованием таймеров, без блокировок пользовательского интерфейса.
public void wait(int milliseconds)
{
System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer();
if (milliseconds == 0 || milliseconds < 0) return;
//Console.WriteLine("start wait timer");
timer1.Interval = milliseconds;
timer1.Enabled = true;
timer1.Start();
timer1.Tick += (s, e) =>
{
timer1.Enabled = false;
timer1.Stop();
//Console.WriteLine("stop wait timer");
};
while (timer1.Enabled)
{
Application.DoEvents();
}
}
Использование:
wait(1000); //wait one second
0
Said
10 Фев 2020 в 08:33
Использование: DelayFactory.DelayAction (500, new Action (() => {this.RunAction ();})); `
// Примечание. Forms.Timer и Timer () имеют схожие реализации. // Предполагается, что у вас будет статический класс DelayFactory
public static void DelayAction(int millisecond, Action action)
{
var timer = new DispatcherTimer();
timer.Tick += delegate
{
action.Invoke();
timer.Stop();
};
timer.Interval = TimeSpan.FromMilliseconds(millisecond);
timer.Start();
}
0
Mark Rowe
18 Дек 2017 в 19:16