Espere um segundo no programa em execução

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

Quero esperar um segundo antes de imprimir minhas células de grade com este código, mas não está funcionando. O que eu posso fazer?

Selçuklu Ebrar
fonte
1
Qual código deve ser executado após a espera de 1 segundo?
Allensb
1
Como você sabe que não está funcionando? Tente sleep 10000 e veja se está funcionando. 1000 é muito curto para avaliar se está funcionando.
Missy
Isso funciona bem: System.Threading.Thread.Sleep (1000);
Andrew

Respostas:

177

Ele está fazendo uma pausa, mas você não vê a cor vermelha aparecer na célula? Experimente isto:

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

Pessoalmente, acho que Thread.Sleepé uma implementação ruim. Ele bloqueia a interface do usuário, etc. Eu pessoalmente gosto de implementações de cronômetro, pois ele espera e dispara.

Uso: 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();
}
Mark Rowe
fonte
15

Função de espera usando temporizadores, sem bloqueios de IU.

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

Uso: basta colocar isso dentro do seu código que precisa esperar:

wait(1000); //wait one second
Disse
fonte
Apenas uma sugestão. Se você multiplicar o mínimo por 60000, o nome do parâmetro será mais significativo. timer1.Interval = min * 60000;
Golda
Sim, você está certo, deve ser milissegundos em vez de min. Vou atualizar o nome. Obrigado
Disse
2

A espera ocupada não será uma desvantagem grave se for curta. No meu caso, houve a necessidade de dar feedback visual ao usuário, piscando um controle (é um controle gráfico que pode ser copiado para a área de transferência, que muda seu fundo por alguns milissegundos). Funciona bem desta forma:

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;
....
ChrisW
fonte
2

Acho que tudo o que estava errado aqui era a ordem, Selçuklu queria que o aplicativo esperasse um segundo antes de preencher a grade, então o comando Sleep deveria vir antes do comando fill.

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

.Net Core parece estar faltando o DispatcherTimer.

Se concordarmos em usar um método assíncrono, Task.Delayisso atenderá às nossas necessidades. Isso também pode ser útil se você quiser esperar dentro de um loop for por motivos de limitação de taxa.

public async Task DoTasks(List<Items> items)
{
    foreach (var item in items)
    {
        await Task.Delay(2 * 1000);
        DoWork(item);
    }
}

Você pode aguardar a conclusão deste método da seguinte forma:

public async void TaskCaller(List<Item> items)
{
    await DoTasks(items);
}
Rich Hildebrand
fonte
Essa é a maneira perfeita. Obrigado ! :)
Deniz
1

use dataGridView1.Refresh();:)

Coder SAJDFJF
fonte
0

Experimente esta função

public void Wait(int time) 
{           
    Thread thread = new Thread(delegate()
    {   
        System.Threading.Thread.Sleep(time);
    });
    thread.Start();
    while (thread.IsAlive)
    Application.DoEvents();
}

Função de chamada

Wait(1000); // Wait for 1000ms = 1s
Savaş SERTER
fonte
0

A melhor maneira de esperar sem congelar seu thread principal é usando a função Task.Delay .

Portanto, seu código será semelhante a este

var t = Task.Run(async delegate
{              
    dataGridView1.Rows[x1].Cells[y1].Style.BackColor = System.Drawing.Color.Red;
    dataGridView1.Refresh();
    await Task.Delay(1000);             
});
amitklein
fonte
-4

Experimente este código:

void wait (double x) {
    DateTime t = DateTime.Now;
    DateTime tf = DateTime.Now.AddSeconds(x);

    while (t < tf) {
        t = DateTime.Now;
    }
}
Bartek Winslawski
fonte
5
Esta é uma solução válida. No entanto, você deve adicionar uma descrição de seus benefícios e malefícios, como mencionar que, por ser uma solução de espera ocupada, ela consumirá tempo de CPU.
1
A solução mais curta é a melhor solução
BASEER ULHASSAN