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
Зайняте очікування не буде серйозним недоліком, якщо воно коротке. У моєму випадку виникла потреба надати візуальний зворотний зв'язок користувачеві, прошивши елемент керування (це елемент керування діаграмою, який можна скопіювати в буфер обміну, який змінює фон на кілька мілісекунд). Це чудово працює таким чином:
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;
....
Я відчуваю, що все, що тут було не так, - це замовлення, Сельчуклу хотів, щоб програма зачекала секунду перед заповненням сітки, тому команда Sleep мала бути перед командою заповнення.
System.Threading.Thread.Sleep(1000);
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
.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;
}
}