Я делаю небольшую игру с функцией автоматического запуска, но программа работает слишком быстро, поэтому пользователь не может видеть результат на каждом этапе. Я использую 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, вам нужно заглянуть в

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