Зачекайте одну секунду в запущеній програмі


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

Я хочу зачекати одну секунду, перш ніж друкувати мої комірки сітки з цим кодом, але це не працює. Що я можу зробити?


1
Який код повинен бути запущений через 1 секунду очікування?
Алленс

1
Звідки ви знаєте, що це не працює? Спробуйте заснути 10000 і перевірте, чи працює. 1000 дуже короткий, щоб оцінити, чи працює.
Міссі,

Це чудово працює: System.Threading.Thread.Sleep (1000);
Ендрю

Відповіді:


177

Це пауза, але ви не бачите, як у клітині з’являється ваш червоний колір? Спробуйте це:

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

15

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

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

Просто пропозиція. Якщо помножити min на 60000, назва параметра буде більш значущою. таймер1.Інтервал = хв * 60000;
Голда,

Так, ви праві, це повинні бути мілісекунди замість хв. Я оновлю назву. Дякую
сказав

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

Я відчуваю, що все, що тут було не так, - це замовлення, Сельчуклу хотів, щоб програма зачекала секунду перед заповненням сітки, тому команда Sleep мала бути перед командою заповнення.

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

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.