Подождите одну секунду в запущенной программе


106
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);

Я хочу подождать одну секунду перед печатью ячеек сетки с помощью этого кода, но он не работает. Что я могу сделать?


1
Какой код должен запускаться после 1 секунды ожидания?
Allensb

1
Как узнать, что это не работает? Попробуйте спать 10000 и посмотрите, работает ли. 1000 очень мало, чтобы оценить, работает ли он.
Мисси

Это отлично работает: System.Threading.Thread.Sleep (1000);
Эндрю

Ответы:


178

Это приостановлено, но вы не видите, что ваш красный цвет отображается в ячейке? Попробуй это:

dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);

28

Лично я считаю, что Thread.Sleepэто плохая реализация. Он блокирует пользовательский интерфейс и т. Д. Мне лично нравятся реализации таймера, так как он ждет, а затем срабатывает.

Использование: DelayFactory.DelayAction(500, new Action(() => { this.RunAction(); }));

//Note Forms.Timer and Timer() have similar implementations. 

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();
}

16

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

public void wait(int milliseconds)
{
    var 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

Просто предложение. Если вы умножите мин на 60000, имя параметра будет более значимым. timer1.Interval = min * 60000;
Golda

Да, вы правы, вместо мин должны быть миллисекунды. Я обновлю название. Спасибо
Сказано

3

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

    System.Threading.Thread.Sleep(1000);
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;

2

Ожидание не будет серьезным недостатком, если оно короткое. В моем случае возникла необходимость предоставить пользователю визуальную обратную связь путем мигания элемента управления (это элемент управления диаграммой, который можно скопировать в буфер обмена, который меняет свой фон на несколько миллисекунд). Он отлично работает так:

using System.Threading;
...
Clipboard.SetImage(bm);   // some code
distribution_chart.BackColor = Color.Gray;
Application.DoEvents();   // ensure repaint, may be not needed
Thread.Sleep(50);
distribution_chart.BackColor = Color.OldLace;
....

2

.Net Core, похоже, не хватает DispatcherTimer.

Если у нас все в порядке с использованием асинхронного метода, Task.Delayэто удовлетворит наши потребности. Это также может быть полезно, если вы хотите подождать внутри цикла for по причинам ограничения скорости.

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

Вы можете дождаться завершения этого метода следующим образом:

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}

Это просто идеальный способ. Спасибо ! :)
Дениз


0

Попробуйте эту функцию

public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}

Функция вызова

Wait(1000); // Wait for 1000ms = 1s

0

Лучший способ подождать, не замораживая основной поток, - использовать функцию Task.Delay .

Итак, ваш код будет выглядеть так

var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});

-4

Возможно, попробуйте этот код:

void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);

    while (t < tf) {
        t = DateTime.Now;
    }
}

5
Это верное решение. Тем не менее, вы должны добавить описание его преимуществ и недостатков, например упомянуть, что, поскольку это решение с ожиданием занятости, оно будет занимать процессорное время.

1
Чем короче решение, тем лучше
BASEER ULHASSAN
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.