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. publicstaticvoidDelayAction(int millisecond,Action action){var timer =newDispatcherTimer();
timer.Tick+=delegate{
action.Invoke();
timer.Stop();};
timer.Interval=TimeSpan.FromMilliseconds(millisecond);
timer.Start();}
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 neededThread.Sleep(50);
distribution_chart.BackColor=Color.OldLace;....
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.
.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.
publicasyncTaskDoTasks(List<Items> items){foreach(var item in items){awaitTask.Delay(2*1000);DoWork(item);}}
Você pode aguardar a conclusão deste método da seguinte forma:
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(asyncdelegate{
dataGridView1.Rows[x1].Cells[y1].Style.BackColor=System.Drawing.Color.Red;
dataGridView1.Refresh();awaitTask.Delay(1000);});
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.
Respostas:
Ele está fazendo uma pausa, mas você não vê a cor vermelha aparecer na célula? Experimente isto:
fonte
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(); }));
fonte
Função de espera usando temporizadores, sem bloqueios de IU.
Uso: basta colocar isso dentro do seu código que precisa esperar:
fonte
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:
fonte
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.
fonte
.Net Core parece estar faltando o
DispatcherTimer
.Se concordarmos em usar um método assíncrono,
Task.Delay
isso 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.Você pode aguardar a conclusão deste método da seguinte forma:
fonte
use
dataGridView1.Refresh();
:)fonte
Experimente esta função
Função de chamada
fonte
A melhor maneira de esperar sem congelar seu thread principal é usando a função Task.Delay .
Portanto, seu código será semelhante a este
fonte
Experimente este código:
fonte