dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Я хочу подождать одну секунду перед печатью ячеек сетки с помощью этого кода, но он не работает. Что я могу сделать?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
Я хочу подождать одну секунду перед печатью ячеек сетки с помощью этого кода, но он не работает. Что я могу сделать?
Ответы:
Это приостановлено, но вы не видите, что ваш красный цвет отображается в ячейке? Попробуй это:
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
dataGridView1.Refresh();
System.Threading.Thread.Sleep(1000);
Лично я считаю, что 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();
}
Функция ожидания с использованием таймеров, без блокировок пользовательского интерфейса.
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
Я чувствую, что все, что здесь было не так, это порядок, Сельчуклу хотел, чтобы приложение подождало секунду перед заполнением сетки, поэтому команда Sleep должна была быть перед командой заполнения.
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
Ожидание не будет серьезным недостатком, если оно короткое. В моем случае возникла необходимость предоставить пользователю визуальную обратную связь путем мигания элемента управления (это элемент управления диаграммой, который можно скопировать в буфер обмена, который меняет свой фон на несколько миллисекунд). Он отлично работает так:
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;
....
.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);
}
использовать dataGridView1.Refresh();
:)
Попробуйте эту функцию
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
Лучший способ подождать, не замораживая основной поток, - использовать функцию 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);
});
Возможно, попробуйте этот код:
void wait (double x) {
DateTime t = DateTime.Now;
DateTime tf = DateTime.Now.AddSeconds(x);
while (t < tf) {
t = DateTime.Now;
}
}