실행중인 프로그램에서 1 초간 기다리십시오.


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

이 코드를 사용하여 그리드 셀을 인쇄하기 전에 1 초를 기다렸지 만 작동하지 않습니다. 어떡해?


1
1 초 기다린 후 어떤 코드가 실행되어야합니까?
Allensb

1
작동하지 않는지 어떻게 알 수 있습니까? 10000 수면을 시도하고 작동하는지 확인하십시오. 1000은 작동하는지 평가하기에 매우 짧습니다.
Missy

이것은 잘 작동합니다 : System.Threading.Thread.Sleep (1000);
Andrew

답변:


178

일시 중지되어 있지만 빨간색이 셀에 나타나지 않습니까? 이 시도:

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

28

개인적으로 나는 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();
}

16

타이머를 사용하는 대기 기능, 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

단지 제안입니다. 최소값에 60000을 곱하면 매개 변수 이름이 더 의미가 있습니다. timer1.Interval = 최소 * 60000;
Golda

네, 맞습니다. 최소 시간이 아니라 밀리 초 여야합니다. 이름을 업데이트하겠습니다. 감사합니다
사이드

3

나는 여기에서 잘못된 것이 주문이라고 생각합니다. Selçuklu는 그리드를 채우기 전에 앱이 잠시 기다리기를 원했기 때문에 채우기 명령보다 먼저 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);
}

그것은 완벽한 방법입니다. 감사 ! :)
Deniz


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
이것은 유효한 해결책입니다. 그러나 바쁜 대기 솔루션이기 때문에 CPU 시간을 차지한다는 언급과 같이 이점과 해로움에 대한 설명을 추가해야합니다.

1
짧은 솔루션이 더 나은 솔루션
BASEER
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.