dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
이 코드를 사용하여 그리드 셀을 인쇄하기 전에 1 초를 기다렸지 만 작동하지 않습니다. 어떡해?
dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
System.Threading.Thread.Sleep(1000);
이 코드를 사용하여 그리드 셀을 인쇄하기 전에 1 초를 기다렸지 만 작동하지 않습니다. 어떡해?
답변:
개인적으로 나는 Thread.Sleep
잘못된 구현 이라고 생각 합니다. 그것은 UI 등을 잠급니다. 나는 그것이 기다린 다음 실행되기 때문에 개인적으로 타이머 구현을 좋아합니다.
용법: 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();
}
타이머를 사용하는 대기 기능, UI 잠금 없음.
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;
....
.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;
}
}